2011-11-03 48 views
3

幾乎在我看到的所有GTK +示例代碼中,GUI的小部件都是在主函數內部定義的。 起初,我採用了這種方式,但後來發現它非常不方便,例如 從單個回調函數中操作多個小部件。 當然,我可以使用'數據'gpointer的,但是我不會 必須包裹我想要在某種結構第一個 中操作的每個部件,以將其作爲'數據'參數傳遞?Gtk +編程風格:定義小部件

無論如何,爲了不受此限制,我剛開始定義主要 函數之外的所有小工具,因此我可以輕鬆地跨所有函數訪問它們。這種風格有什麼缺點嗎?

回答

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; 
} 

在大型程序,更好的方法是創建自己的類代表主窗口,首選項對話框等,並將這些類傳遞給各種回調。

+0

謝謝你的迴應!我想在一天結束的時候,讓雙方都開心的最簡單的方法就是,就像你所說的那樣,從一開始就把每一個小部件放在一個大結構中,然後每次都傳遞它。 (雖然,如果我需要小部件和信號處理程序ID,該怎麼辦?似乎小部件總是會阻止'gpointer userdata') – Ancurio

+0

沒有什麼能夠阻止您在結構中放置信號處理程序ID。 – ptomato

+0

是的..猜你是對的 – Ancurio

相關問題