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

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


person Masterofpsi    schedule 09.06.2010    source источник


Ответы (3)


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

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

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

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

person ptomato    schedule 10.06.2010
comment
Это кажется хорошим. Я изучал исходники GNOME, чтобы понять, как они это делают, и они делают подкласс GtkWindow. Однако я не уверен, что они используют описанную вами технику. - person Masterofpsi; 11.06.2010
comment
Какие приложения вы смотрите? Иногда я смотрю в Gedit примеры того, как что-то делать, но он огромен. - person ptomato; 11.06.2010
comment
Я тоже обычно смотрю на Gedit. Однако, как оказалось, Gedit на самом деле не использует GtkBuilder — на самом деле, я почти уверен, что ни одно из стандартных приложений GNOME не использует его. Что, я думаю, объясняет мое замешательство — я ожидал, что любой в здравом уме захочет использовать GtkBuilder. - person Masterofpsi; 01.07.2010
comment
GtkBuilder относительно новый, поэтому для его использования старым приложениям придется переносить устаревший код. Кроме того, это, вероятно, более полезно для простых приложений со статическим интерфейсом... - person JanC; 24.08.2010
comment
Собственно, именно в сложных приложениях GtkBuilder абсолютно незаменим. Если приложение простое со статическим интерфейсом, вы можете просто создать графический интерфейс в коде и забыть об этом. - person ptomato; 08.09.2010

создание подкласса GtkWindow не является общепринятой практикой.

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

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

person Alexey Yakovenko    schedule 09.06.2010

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

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

person Grim    schedule 25.08.2010