【问题标题】:Gtk+ programming style: defining widgetsGtk+ 编程风格:定义小部件
【发布时间】:2011-12-21 13:28:03
【问题描述】:

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

无论如何,为了不受此约束,我刚刚开始定义 main 之外的所有 Widget 函数,所以我可以轻松地在所有函数中访问它们。这种风格有什么缺点吗?

【问题讨论】:

    标签: c callback gtk widget


    【解决方案1】:

    缺点与使用任何全局变量的缺点相同。 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;
    }
    

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

    【讨论】:

    • 感谢您的回复!我想在一天结束时,让双方都开心的最简单方法是,就像你建议的那样,从一开始就将每个小部件放在一个大结构中,然后每次都传递它。 (不过,如果我需要小部件和信号处理程序 ID 该怎么办?似乎小部件总是会阻止“gpointer userdata”)
    • 没有什么可以阻止您将信号处理程序 ID 也放入结构中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多