Я довольно новичок в GTK и возился со своим первым "серьезным" приложением GTK (gtk+-3). Я хотел бы обратиться к опыту других людей, чтобы узнать, когда уместно определить новый класс GTK, или просто использовать "ванильные" классы GTK, и реализовать поведение через обработчики сигналов.
На данный момент я нашел два примера:
Я создаю новый виджет: по сути, GtkDrawingArea, который я использую для отображения некоторых данных. Изначально я предполагал, что лучшим способом реализации этого будет подкласс GtkDrawingArea, использующий G_DEFINE_TYPE
, и предоставление собственного обратного вызова draw:
static void mywidget_class_init(MyWidgetClass *klass)
{
GTK_WIDGET_CLASS(klass)->draw = mywidget_draw;
}
Однако, похоже, что я могу реализовать точно такую же функциональность без определения нового типа, просто создав ванильный GtkDrawingArea и подключив соответствующие сигналы при инициализации.
[Мой пользовательский виджет в конечном итоге будет предоставлять больше, чем просто обратный вызов draw, поскольку он должен быть интерактивным, но об этом позже... ]
Мое приложение состоит из нескольких различных окон, которые в настоящее время являются ванильными GtkWindows:
struct myapp_somewindow {
struct myapp *app;
GtkWindow *window;
GtkWidget *some_label_that_is_updated;
/*... other window-specific fields */
}
Когда инициализируется структура myapp_somewindow, я создаю GtkWindow с помощью gtk_window_new()
, инициализирую виджеты/макеты/etc и подключаю сигналы. [Вероятно, со временем я буду использовать .ui файлы для более сложных случаев, но пока окна достаточно просты]
Это можно сделать, определив новый подкласс GtkWindow, но я не уверен, когда накладные расходы на определение нового класса станут оправданными.
Я понимаю, что, вероятно, нет строгих правил для выбора подхода, но есть ли какие-нибудь общие рекомендации, которые можно использовать при принятии таких решений? Есть ли какие-нибудь основные подводные камни в любом подходе?