Использование пользовательских виджетов с glade / Gtkbuilder

Я разрабатываю приложение с Gtk и Glade. Мое впечатление, что это обычная практика создания подкласса GtkWindow для вашего главного окна, но я застрял на том, как я бы построил свой подкласс из определения GtkBuilder. Кто-нибудь знает как?

3 ответов


наследование GtkWindow более распространен в различных языковых привязках GTK, чем в plain C. Вы не упомянули, какой язык вы используете.

что сказал, как я подкласс GtkWindow В C, чтобы создать содержимое окна в Поляне, но не само окно. В Glade 3 (IIRC) вы можете щелкнуть правой кнопкой мыши на виджете в палитре и выбрать "добавить виджет как верхний уровень", чтобы разместить виджет не верхнего уровня без контейнера.

затем напишите код для вашего подкласса GtkWindow, назовем его MyAppWindow. Я не буду вдаваться в этот ответ, так как в документации GObject есть много примеров. В функции init (my_app_window_init()) загрузите файл Glade, используйте gtk_builder_get_object() чтобы получить указатель на самый внешний виджет в файле Поляны и использовать gtk_container_add(), чтобы добавить его в окно вы строите. Тогда используйте gtk_builder_connect_signals() как обычно.

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


Это не обычная практика для подкласса GtkWindow.

Я не думаю, что можно подкласс окна верхнего уровня, созданного из определения gtkbuilder.

gtkbuilder должен знать о вашем подклассе виджета перед созданием.


Если вы действительно хотите создать свой собственный подкласс GtkWindow ptomato хорошо описывает основные шаги. Также можно создать плагины для glade, чтобы сделать ваши пользовательские виджеты доступными. Но это не очень легко, и, скорее всего, не то, что вы хотите сделать.

большинство приложений используют только стандартные виджеты без подклассов любого из них. Затем, загрузив файл glade с помощью gtkbuilder (или libglade) , вам не нужно иметь специальный класс для вашего GUI (как в некоторых других RAD-инструментах) вместо этого вы просто получаете набор объектов. API позволяет вам искать их по имени (и окно в основном является одним из них). Общий подход-искать все виджеты, с которыми вы собираетесь взаимодействовать, и хранить их в глобальных переменных при запуске программы. Или, если вам нужно несколько экземпляров окна, вы можете создать структуру для их хранения. Или вы можете просто искать виджеты каждый раз, когда они вам нужны. Обратите внимание, что набор объектов, которые вы получаете, полностью динамичен. Вы можете, например, переместить виджеты между различными окнами так же, как если бы вы создали GUI программно.