Есть окно с контейнером и кнопками. В жмешь на одну кнопку - в контейнер грузится одна страница, жмешь на другую - другая страница с контролами и тп. Для примера - два glade-файла.
#include <gtkmm.h>
#include <iostream>
#include <string>
class MainWindow : public Gtk::ApplicationWindow {
public:
MainWindow(BaseObjectType* obj, Glib::RefPtr<Gtk::Builder> const& builder)
: Gtk::ApplicationWindow(obj)
, builder{builder}
{
...
builder->get_widget("mainbox",mainbox); // контейнер страниц
Gtk::FlowBox* menu_main = nullptr;
builder->get_widget("menu_main", menu_main); // главное меню
if(menu_main)
{
//mainbox->pack_start( btn1);
mainbox->pack_start(*menu_main);
}
...
this->show_all();
}
MainWindow(BaseObjectType* obj, Glib::RefPtr<Gtk::Builder> const& builder, char *gladefile): Gtk::ApplicationWindow(obj)
{
}
private:
Glib::RefPtr<Gtk::Builder> builder;
Gtk::Box *mainbox;
};
int add_glade_res(Glib::RefPtr<Gtk::Builder> refBuilder, char* gxml_path)
{
try{
refBuilder->add_from_resource(gxml_path);
} catch (...){
std::cerr << "Error loading glade map resource" << gxml_path << std::endl;
return 0;
}
return 1;
}
int on_cmd(const Glib::RefPtr<Gio::ApplicationCommandLine> &,
Glib::RefPtr<Gtk::Application> &app) {
app->activate(); // <----
return 0;
}
int main(int argc, char **argv){
auto app = Gtk::Application::create(argc, argv, "r21", Gio::APPLICATION_HANDLES_COMMAND_LINE);
app->signal_command_line().connect(sigc::bind(sigc::ptr_fun(on_cmd), app), false);
// Load the GtkBuilder file and instantiate its widgets:
auto refBuilder = Gtk::Builder::create();
if(!add_glade_res(refBuilder, "/r21/glade/main.glade")) return 1;
if(!add_glade_res(refBuilder, "/r21/glade/mainmenu.glade")) return 1;
MainWindow *wnd = nullptr;
refBuilder->get_widget_derived("main_window", wnd);
if (wnd){
app->run(*wnd);
}
delete wnd;
return 0;
}
Вот glade файлы: main.glade
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.40.0 -->
<interface>
<requires lib="gtk+" version="3.20"/>
...
<object class="GtkApplicationWindow" id="main_window">
...
<child>
<object class="GtkBox" id="mainbox">
...
<child>
<object class="GtkToolbar">
...
<child>
<object class="GtkToolButton" id="main_btn_connect">
...
</object>
<packing>
<property name="expand">False</property>
<property name="homogeneous">True</property>
</packing>
</child>
<child>
<object class="GtkMenuToolButton" id="main_btn_help">
...
</object>
...
</object>
</interface>
mainmenu.glade:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.40.0 -->
<interface>
<requires lib="gtk+" version="3.24"/>
<object class="GtkWindow">
...
<child>
<object class="GtkFlowBox" id="menu_main">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
...
</child>
</object>
</child>
</object>
</interface>
Ошибок не выдает, в gdb показывает, что вроде находит это меню, но на экране не видно.