Как добавить вкладки Gtk :: Notebook во время выполнения из определений Glade?

Я создаю новое приложение GTK (используя gtkmm), и основной интерфейс имеет вкладки, немного похоже на веб-браузер.

Я хочу создать новую вкладку для каждого документа, который открывает пользователь, с содержимым каждой вкладки, определяемым Glade. Я новичок в gtkmm, поэтому я не уверен, как это сделать.

Если я создаю свою вкладку в Glade как отдельное окно, когда я вызываю Gtk::Builder::get_widget() возвращает указатель на Gtk::Window, но я не могу передать это Gtk::Notebook::append_page() потому что эта функция требует ссылки, и у меня есть только указатель. Я не хочу разыменовывать указатель, потому что я верю каждому вызову get_widget() возвращает тот же указатель — поэтому, если я хочу добавить пять страниц одинаково, мне нужно как-то клонировать структуру пользовательского интерфейса, прежде чем добавить ее в Gtk::Notebook — в противном случае изменение элемента пользовательского интерфейса на одной вкладке приведет к его изменению и на других четырех вкладках, поскольку все они указывают на одни и те же виджеты пользовательского интерфейса.

Каков наилучший способ взять окно, разработанное в Glade, и динамически добавить его несколько раз в Gtk::Notebook?


РЕДАКТИРОВАТЬ:

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

Однако я все еще не могу добавить загруженную структуру в Gtk::Notebook:

  • Если я скажу Gtk::Builder::get_widget() чтобы получить корень Gtk::Window от .glade файл и добавить его в качестве новой вкладки, он не будет компилироваться, потому что я должен передать Gtk::Widget в append_page() и он не примет Gtk::Window параметр вместо.
  • Если я скажу ему выбрать самый верхний виджет, то я получу кучу ошибок во время выполнения:

    Can't set a parent on widget which has a parent
    gtkcontainer.c:858: container class `gtkmm__GtkWindow' has no child property named `tab-expand'
    gtkcontainer.c:858: container class `gtkmm__GtkWindow' has no child property named `tab-fill'
    gtkcontainer.c:858: container class `gtkmm__GtkWindow' has no child property named `tab-label'
    gtkcontainer.c:858: container class `gtkmm__GtkWindow' has no child property named `menu-label'
    gtkcontainer.c:858: container class `gtkmm__GtkWindow' has no child property named `position'
    Gtk:ERROR:gtkcontainer.c:3541:gtk_container_propagate_draw: assertion failed: (gtk_widget_get_parent (child) == GTK_WIDGET (container))
    Aborted (core dumped)
    
  • Если я возьму самый верхний виджет и вместо этого позвоню reparent() и передать Gtk::Notebook как новый родитель, тогда новая вкладка отображается со всеми правильно расположенными виджетами, но тогда я не могу контролировать заголовок вкладки.

Должен быть «правильный» способ сделать это, я просто не могу понять, что это такое!

2

Решение

Благодаря помощи от gtkmm список рассылки, у меня есть решение.

На поляне я создал Gtk::Window с одним Gtk::Box и поместите все мои элементы управления в Box, Это вызвало проблемы при попытке добавить Box в качестве новой вкладки, потому что Box уже был родитель ( Gtk::Window) так что это было хлопотно, пытаясь сделать Gtk::Notebook новый родитель.

Вместо этого я обнаружил, что вы можете щелкнуть правой кнопкой мыши на кнопке Gtk::Box в поляне и выберите «Добавить виджет как верхний уровень». Тогда нет необходимости Gtk::Window на всех, и как Box не имеет родителя, звонит Gtk::Notebook::append_page() и прохождение Gtk::Box работает отлично. Я могу тогда использовать вариант append_page() это позволяет мне установить заголовок вкладки одновременно.

Однако все еще необходимо создать новый Gtk::Builder экземпляр, чтобы загрузить элементы управления для каждой вкладки, потому что каждая вкладка нуждается в новом экземпляре элементов управления. Если вы просто продолжаете звонить Gtk::Builder::get_widget() на том же объекте он возвращает тот же экземпляр элементов управления.

1

Другие решения


По вопросам рекламы [email protected]