
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.3] |
![]() |
|
Сообщ.
#1
,
|
|
|
С использованием glade. Есть главное окно в одном glade-файле, там есть контейнер Gtk::Box. Есть другой glade-файл, там окно в котором Gtk::FlowBox с кнопками. Его надо достать и вставить в Gtk::Box главного окна. И таких файлов со страницами несколько плюс там еще свой код и каллбеки. Как это реализовать? Есть ли примеры?
Когда просто получаешь билдером этот FlowBox и вставляешь потом в Box не вставляется. Видимо, надо как-то клонировать этот FlowBox или извлекать, а потом вставлять в другой контейнер. |
Сообщ.
#2
,
|
|
|
Положа честную лапу на доброе сердце ...=) GTK никогда не юзал. Но, если ты выложишь сюда тестовый пример - обещаю, попробую разобраться. Ну конечно, в меру моих сил
![]() |
Сообщ.
#3
,
|
|
|
![]() ![]() #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> Добавлено Как в glade-файлах делать просто FlowBox без окна чтобы без родительского окна я не знаю. Пробовал OffscreenBox не помогает. |