2016-12-27 7 views
0

タイトルと同じように、ヘッダ(QHeaderView)を持つQTreeViewのスクロールバーを再描画すると、スクロールバーの高さがQTreeViewの高さになります。スクロールバーの高さはQTreeViewの高さマイナス以下PICのようなヘッダのheight.justに等しい: QTreeViewでスクロールバーの高さを指定する方法

just like this, exclude the height of header

答えて

0

問題に対する解決策は、Y軸上(QHeaderViewから取得constant_offset値に垂直スクロールバーの位置を設定するかもしれません)。

これはそうようQTreeViewをサブクラス化することによって行うことができる:

class MyTreeView : public QTreeView 
{ 
public: 
    MyTreeView(QWidget* parent = nullptr): QTreeView(parent){} 

    void updateVertScrollBar() 
    { 
     auto* ptr = verticalScrollBar(); 
     QRect rect = ptr->geometry(); 
     rect.setTop(header()->height()); 
     ptr->setGeometry(rect); 
    } 

    void resizeEvent(QResizeEvent* ev) override 
    { 
     QTreeView::resizeEvent(ev); 
     updateVertScrollBar(); 
    } 
}; 

updateVertScrollBar方法は、データがサンプル実装に充填された又は提示された直後の更新が毎に発生する可能性と呼ぶことができsizePolicyに応じresizeEvent - ウィジェットに対して実行されるさまざまなサイズ変更をカバーする必要があります。さらに収縮スクロールバーから左空白を削除

EDIT

はトリッキーになります。まず、QTreeViewがビューポートウィジェットとスクロールバーから構築されていることを示します。表示される問題は、ビューポートと垂直スクロールバーの幅(表示されている場合)が一致する必要があり、これが内部的に計算されるという事実に起因します。

私は、これらのコンポーネントのサイズを強制しようとすると、何かが起こっているので、トリッキーだと述べました。一部の更新はインプレースと呼ばれ、イベントループを通じて呼び出されるものもあります。 thisにチェックをして、そのコンセプトについてより詳細な情報を得ることができます。同様のアプローチはおそらくQTreeViewに適用されます。

基本的には、ビューポートの幅を引き伸ばす必要があります。これはおそらくresizeEventの間に行われるべきですが、viewport()->setGeometry()のようなメソッドからの呼び出しはうまく終了しないかもしれません。ループに巻き込まれる可能性があります。 blockSignalsを試すかもしれませんが、これが役立つかどうかはわかりません。一般に、与えられたQtウィジェットの内部構造を混乱させたい場合は、少なくとも簡単にその実装を行うべきです。

+0

これはできますが、ヘッダーには空白の隙間があり、その幅はスクロールバーの幅と同じです。ヘッダーで空白の隙間を削除するにはどうすればよいですか? – Lomuto

+0

体験していることを示す画像を貼り付けます。スクロールバーの周りの興味のある領域だけで十分でしょう。 – Dusteh

+0

[このように](https://1drv.ms/i/s!AuRlDm0ORHE_hN4McM_n9FAw1_8S8w) – Lomuto

関連する問題