Как сделать виджет Gtk+ внутри GtkScrolledWindow для расширения при упаковке в GtkPane?

У меня есть программа, которая показывает два GtkTreeView с упакованы внутри GtkPaned ( SSCCE: здесь):

gtk_paned_add1(GTK_PANED(paned), tree_view1);
gtk_paned_add2(GTK_PANED(paned), tree_view2);

Результат следующий:

Окно, представляющее два дерева

Однако таблицы могут стать больше, поэтому я добавил GtkScrolledWindow s (sscce: здесь):

GtkWidget *scrolled_window1 = gtk_scrolled_window_new(NULL, NULL),
          *scrolled_window2 = gtk_scrolled_window_new(NULL, NULL);
gtk_container_add(GTK_CONTAINER(scrolled_window1), tree_view1);
gtk_container_add(GTK_CONTAINER(scrolled_window2), tree_view2);
gtk_paned_add1(GTK_PANED(paned), scrolled_window1);
gtk_paned_add2(GTK_PANED(paned), scrolled_window2);

Однако теперь окно сворачивается так, что становится почти тонким трансом, как на скриншоте ниже:

Безумно маленькое окно

Если я разверну окно, первый столбец не появится (хотя я могу развернуть его вручную):

Первая таблица не появляется

Итак, каков наилучший способ получения первого скриншота, используя GtkScrolledWindows по этому сценарию? Кроме того, могу ли я определить размер столбцов панели по отношению друг к другу (например, 30% для первого, 70% для второго?

2 ответа

Решение

Решение, которое я принял, состояло в том, чтобы фактически установить размер прокручиваемых окон ( sscce):

gtk_widget_set_size_request(scrolled_window1, 200, 600);
gtk_widget_set_size_request(scrolled_window2, 600, 600);

Результатом было, как и следовало ожидать, окно с разрешением 800x600:

Окно с хорошими размерами

Я не удовлетворен: этот подход опирается на произвольные размеры и кажется слишком "ручным". Тем не менее, я хочу использовать свое программное обеспечение, поэтому сейчас я его приму.

Я использовал этот шаблон (я был бы рад, если бы кто-то отправил лучший ответ):

GtkWidget* treeView_, pane1_;
// [Removed code to create and show the widget heirarchy.]
GtkRequisition sizeReq;
gtk_widget_size_request(treeView_, &sizeReq);  // get tree's preferred size
gtk_paned_set_position(GTK_PANED(pane1_), sizeReq.width);

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

Кроме того, существуют требования для gtk_widget_size_request(), возвращающей что-то значимое. В моем случае я вызвал gtk_widget_show_all() в иерархии перед получением запроса размера.

Другие вопросы по тегам