Я разрабатываю приложение с Gtk и Glade. Я считаю, что обычной практикой является создание подкласса GtkWindow для вашего основного окна, но я зациклился на том, как я буду строить свой подкласс из определения GtkBuilder. Кто-нибудь знает, как?
Использование пользовательских виджетов с помощью glade/Gtkbuilder
Ответ 1
Подклассификация GtkWindow
более распространена в различных языковых привязках GTK, чем на простом C. Вы не указали, какой язык вы использовали.
Тем не менее, способ, которым я занимаюсь подклассом GtkWindow
в C, заключается в создании содержимого окна в Glade, но не в самом окне. В Glade 3 (IIRC) вы можете щелкнуть правой кнопкой мыши по виджету в палитре и выбрать "Добавить виджет как toplevel", чтобы разместить виджет без верхнего уровня без контейнера.
Затем напишите код для вашего подкласса GtkWindow
, позвоните ему MyAppWindow
. Я не буду вдаваться в это в этом ответе, поскольку в документации GObject есть много примеров. В функции init (my_app_window_init()
) загрузите файл Glade, используйте gtk_builder_get_object()
, чтобы получить указатель на внешний вид в файле Glade, и используйте gtk_container_add()
, чтобы добавить его в окно, которое вы создаете. Затем используйте gtk_builder_connect_signals()
, как обычно.
Вы должны установить все свойства окна вручную таким образом, поскольку вы не можете сделать это в Glade, но кроме этого я нашел, что он работает хорошо.
Ответ 2
для подкласса GtkWindow не является обычной практикой.
Я не думаю, что возможно подклассы toplevel window, созданные из определения gtkbuilder.
gtkbuilder должен знать о вашем подклассе виджета перед созданием.
Ответ 3
Если вы действительно хотите создать свой собственный подкласс GtkWindow, ptomato хорошо описывает основные этапы. Также возможно создавать плагины для поляны, чтобы сделать ваши пользовательские виджеты доступными. Но это не очень просто и, скорее всего, не то, что вы хотите сделать.
В большинстве приложений используются только стандартные виджеты без подклассификации любого из них. Затем, загружая файл glade с помощью gtkbuilder (или libglade), вам не нужно иметь специальный класс для вашего графического интерфейса (например, в некоторых других инструментах RAD), вместо этого вы просто получаете набор объектов. API позволяет вам искать их по имени (и окно в основном является одним из них). Общим подходом является поиск всех виджетов, с которыми вы собираетесь взаимодействовать, и хранить их в глобальных переменных при запуске программы. Или, если вам нужно несколько экземпляров окна, вы можете создать структуру для их хранения. Или вы можете просто искать виджеты каждый раз, когда они вам понадобятся. Обратите внимание, что набор объектов, которые вы получаете, полностью динамичен. Например, вы можете перемещать виджеты между разными окнами так же, как если бы вы создавали графический интерфейс программно.