Gtk +编程风格:定义小部件

时间:2011-11-03 21:10:30

标签: c callback gtk widget

几乎每个GTK +的示例代码到目前为止我都看过, GUI的小部件都在main函数内定义。 起初我采用了这个,但后来发现它非常不方便 例如从单个回调函数操作多个小部件。 当然我可以使用'data'gpointer,但不是我 必须首先包装我想要在某种结构中操作的每个小部件 将它作为'数据'参数传递?

无论如何,为了不受此限制,我刚开始定义主要之外的所有小部件 功能,所以我可以轻松访问所有功能。这种风格有什么缺点吗?

1 个答案:

答案 0 :(得分:2)

缺点与使用任何全局变量的缺点相同。 This page可以很好地概述您不应该(以及何时应该)使用全局变量的情况。如果你看到底部附近,你会看到“使用全局变量的真正错误的理由”:

  

我不想一直传递它。

我担心这是你的反对意见。但是,正如我链接到的页面也提到过,如果你只是编写简短或一次性程序,那么使用全局变量的容易程度可能会超过缺点。

中型程序的常用方法是创建一个结构并在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;
}

在大型程序中,更好的方法是创建自己的表示主窗口,首选项对话框等的类,并将这些类传递给各种回调。