Как получить высоту заголовка gtktreeview?
-
22-07-2019 - |
Вопрос
Я посмотрел в исходном коде 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.
Решение
Причина, по которой ваш код не работает, заключается в том, что вы, вероятно, слишком нетерпеливы, не давая GTK + времени на перерисовку виджетов, прежде чем снова сделать заголовки невидимыми.
GTK + не рисует сразу, когда вы делаете вызов, который требует перерисовки. Вместо этого перерисовки ставятся в очередь, а затем выполняются все сразу из основного цикла GTK +. Таким образом, два последовательных изменения виджетов не вызывают двух перерисовок, а только одного.
Это что-то вроде хака, но вы можете попробовать " классический " GTK + трюк с очисткой событий, вставляя такой цикл после включения заголовков:
while(gtk_events_pending())
gtk_main_iteration();
Это просто зацикливается до тех пор, пока в очереди GTK + есть события (упомянутые выше изменения отрисовки являются внутренними событиями), и сбрасывает их, а затем возвращает управление вам. Вполне вероятно, что это приведет к некоторому визуальному мерцанию.