Стиль программирования Gtk +: определение виджетов - PullRequest
3 голосов
/ 04 ноября 2011

Практически в каждом примере кода GTK +, который я видел до сих пор, все виджеты GUI определены внутри основной функции. Сначала я принял это, но потом нашел очень неудобным, когда например манипулирование несколькими виджетами из одной функции обратного вызова. Конечно, я мог бы просто использовать для этого gpointer «data», но я бы не стал должен обернуть каждый виджет, которым я хочу манипулировать в какой-то структуре в первую очередь передать его как аргумент 'data'?

Во всяком случае, чтобы не быть связанным этим, я только начал определять все виджеты вне основного функция, так что я могу легко получить к ним доступ через все функции. Есть ли недостатки этого стиля?

1 Ответ

2 голосов
/ 04 ноября 2011

Недостатки такие же, как и недостатки использования любой глобальной переменной. Эта страница содержит хороший обзор ситуаций, когда вам не следует (и когда вам следует) использовать глобальные переменные. Если вы посмотрите внизу, вы увидите «Неправильные причины для использования глобальных переменных»:

Я не хочу все время обмениваться.

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

Обычный способ в программах среднего размера - создать структуру и заполнить ее в main() и передать ее обратным вызовам:

typedef struct {
    GtkWidget *window, *button, *textfield;
} Widgets;

int main(int argc, char **argv) {
    gtk_init(&argc, &argv);
    Widgets *w = g_slice_new0(Widgets);
    w->window = gtk_window_new(... etc...
    ...
    g_signal_connect(w->button, "clicked", G_CALLBACK(on_clicked), w);
    ...etc...
    gtk_main();
    g_slice_free(Widgets, w);
    return 0;
}

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

...