LINUX.ORG.RU

Как реализовать страничность в gtkmm?

 , , ,


0

2

Есть окно с контейнером и кнопками. В жмешь на одну кнопку - в контейнер грузится одна страница, жмешь на другую - другая страница с контролами и тп. Для примера - два 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 показывает, что вроде находит это меню, но на экране не видно.