1

gtk ソース コードを調べたところ、ヘッダーの高さは非公開です。何かを試してみましたが、思い通りに動作しませんでした (heightWithHeader が 1 ?!)

Glib::RefPtr<Gdk::Window> pWindow = treeView.get_bin_window();

treeView.set_headers_visible(true);
pWindow->get_size(width, heightWithHeader);

treeView.set_headers_visible(false);

pWindow->get_size(width, heightWithoutHeader);

r_treeView.set_headers_visible(true);

returnValue = heightWithHeader - heightWithoutHeader;

別の解決策やコードの修正を手伝ってもらえますか?

更新:固定数の行を表示するには、ツリービューの高さを調整する必要があります。これを行うには、コンテナー (スクロール ウィンドウ) のサイズを headerHeight + numberRowsToDisplay * heightOfRow に調整します。

4

1 に答える 1

-1

あなたのコードが機能しない理由は、あなたが「あまりにもせっかち」で、ヘッダーを再び非表示にする前に GTK+ にウィジェットの再描画を行う時間を与えていない可能性が非常に高いです。

再描画が必要な呼び出しを行っても、GTK+ はすぐには描画しません。代わりに、再描画はキューに入れられ、GTK+ メイン ループから一度に実行されます。このように、ウィジェットに対して 2 つの変更を順番に実行しても、再描画は 2 回ではなく、1 回だけです。

ちょっとしたハックですが、ヘッダーをオンにした後に次のようなループを挿入することで、「古典的な」GTK+ イベントフラッシュのトリックを試すことができます。

while(gtk_events_pending())
  gtk_main_iteration();

これは、GTK+ のキューにイベントがある限り単純にループし (上記の描画変更は内部的にイベントです)、それらをフラッシュしてから、制御をユーザーに戻します。ただし、これにより、視覚的なちらつきが発生する可能性が非常に高くなります。

于 2009-05-08T08:35:07.053 に答える