Как получить высоту заголовка gtktreeview? - PullRequest
1 голос
/ 08 мая 2009

Я посмотрел в исходном коде 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.

1 Ответ

0 голосов
/ 08 мая 2009

Причина, по которой ваш код не работает, очень вероятно, что вы "слишком нетерпеливы", не давая GTK + времени на перерисовку виджетов, прежде чем вы снова сделаете заголовки невидимыми.

GTK + не рисует сразу, когда вы делаете вызов, который требует перерисовки. Вместо этого перерисовки ставятся в очередь, а затем выполняются все сразу из основного цикла GTK +. Таким образом, два последовательных изменения виджетов не вызывают двух перерисовок, а только одного.

Это что-то вроде хака, но вы можете попробовать "классический" трюк с обработкой событий GTK +, вставив такой цикл после включения заголовков:

while(gtk_events_pending())
  gtk_main_iteration();

Это просто зацикливается до тех пор, пока в очереди GTK + есть события (упомянутые выше изменения при отрисовке являются внутренними событиями), и сбрасывает их, а затем возвращает управление вам. Вполне вероятно, что это приведет к некоторому визуальному мерцанию.

...