Я создаю новое приложение 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
как новый родитель, тогда новая вкладка отображается со всеми правильно расположенными виджетами, но тогда я не могу контролировать заголовок вкладки.
Должен быть «правильный» способ сделать это, я просто не могу понять, что это такое!
Благодаря помощи от 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()
на том же объекте он возвращает тот же экземпляр элементов управления.