GTK+ 2.0 教學-複合方塊Combo Box

複合方塊(combo box)是另一個很簡單的元件,實際上它僅僅是其它元件的集合。從用戶的觀點來說,這個元件是由一個文字輸入元件和一個下拉選單組成的,用戶可以從一個預先定義的列表裡面選擇一個選項,同時,用戶也可以直接在文字框裡面輸入文字。

下面是從定義複合方塊元件的結構裡面摘取出來的,從中可以看到複合方塊元件是由什麼元件組合形成的:

struct _GtkCombo { 
        GtkHBox hbox; 
        GtkWidget *entry; 
        GtkWidget *button;
        GtkWidget *popup; 
        GtkWidget *popwin; 
        GtkWidget *list;
	...  };

可以看到,複合方塊元件有兩個主要部分:一個輸入框和一個列表。

用下面的函式創建複合方塊元件:

GtkWidget *gtk_combo_new( void );

現在,如果想設置顯示在輸入框部分中的字串,可以直接操縱複合方塊元件內部的文字輸入元件:

gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (combo)->entry), "My String.");

要設置下拉列表中的值,可以使用下面的函式:

void gtk_combo_set_popdown_strings( GtkCombo *combo,
                                    GList    *strings );

在使用這個函式之前,先得將要添加的字串組合成一個GList鏈表。GList是一個鏈結串列,是 GLib 的一部分,而GLib是 GTK 的基礎。暫時你可以先設置一個GList指標,其值設為 NULL,然後用下面的函式將字串追加到鏈結串列當中:

GList *g_list_append( GList *glist, 
                      gpointer data );

要注意的是:一定要將GList鏈結串列的初值設為 NULL,必須將 g_list_append() 函式傳回的值做為GList新的指標。

下面是一段典型的程式碼,用於創建一個選項列表:

GList *glist = NULL;

    glist = g_list_append (glist, "String 1");
    glist = g_list_append (glist, "String 2");
    glist = g_list_append (glist, "String 3"); 
    glist = g_list_append (glist, "String 4");

    gtk_combo_set_popdown_strings (GTK_COMBO (combo), glist);

    /* 現在可以釋放glist了,複合方塊已經複製了一份 */

複合方塊將傳給它的glist結構裡的字串複製了一份。因此,在恰當的情況下,你應該確認釋放了鏈結串列所使用的記憶體。

到這裡為止,你已經有了一個可以使用的複合方塊元件了。有幾個行為是可以改變的。下面是相關的函式:

void gtk_combo_set_use_arrows( GtkCombo *combo,
                               gboolean  val );

void gtk_combo_set_use_arrows_always( GtkCombo *combo,
                                      gboolean  val );

void gtk_combo_set_case_sensitive( GtkCombo *combo,
                                   gboolean  val );

gtk_combo_set_use_arrows ()讓用戶用上/下方向鍵改變文字輸入元件裡的值。這並不會彈出列表框,只是用列表中的下一個列表項替換了文字輸入框中的文字(向上則取上一個值,向下則取下一個值)。這是通過搜索當前項在列表中的位置並選擇前一項/下一項來實現的。通常,在一個輸入框中方向鍵是用來改變焦點的(也可以用TAB鍵)。注意,如果當前項是列表的最後一項,按向下的方向鍵會改變焦點的位置(這對當前項為列表的第一項時按向上方向鍵也適用)。

如果當前值並不在列表中,則 gtk_combo_set_use_arrows() 函式的功能會失效。

同樣地,gtk_combo_set_use_arrows_always()允許使用上/下方向鍵在下拉列表中選取列表項,但是它在列表項中循環,也就是當列表項位於第一個表項時按向上方向鍵,會跳到最後一個,當列表項位於最後一個表項時按向下方向鍵,會跳到第一個。這樣可以完全禁止使用方向鍵改變焦點。

gtk_combo_set_case_sensitive() 函式切換 GTK 是否以區分大小寫的方式搜索其中的列表項。這在複合方塊根據內部文字輸入元件中的文字查找列表值時使用。可以將其設置為區分大小寫或不區分。如果用戶同時按 下MOD-1和「Tab」鍵,複合方塊元件還可以簡單地補全當前輸入。MOD-1一般被 xmodmap 工具映射為「Alt」鍵。注意,一些視窗管理器也要使用這種組合鍵方式,這將覆蓋 GTK 中這個組合鍵的使用。

注意,我們使用的是複合方塊元件,它能夠為我們從一個下拉列表中選擇一個選項。這一點是很直截了當的。大多數時候,你可能很關心怎樣從其中的文字輸入元件中獲取資料。複合方塊元件內部的文字輸入元件可以用GTK_ENTRY (GTK_COMBO (combo)->entry)存取。一般你想要做的兩件主要工作一個是連接到activate信號,當用戶按ENTER鍵時就能夠進行響應,另一個就是讀出其中的文字。第一件工作可以用下面的方法實現:

    g_signal_connect (GTK_COMBO (combo)->entry, "activate",
                      G_CALLBACK (my_callback_function), my_data);

可以使用下面的函式在任意時候取得文字輸入元件中的文字:

gchar *gtk_entry_get_text( GtkEntry *entry );

具體做法如下:

    gchar *string;

    string = gtk_entry_get_text (GTK_ENTRY (GTK_COMBO (combo)->entry));

這就是取得文字輸入框中字串的方法。下面有一個函式

void gtk_combo_disable_activate( GtkCombo *combo );

它將停用複合方塊元件內部的文字輸入元件的activate信號。我不明白你為什麼想要用它,不過還是提供了。

感謝你看到這裡,很快就可以離開了,但最好的獎勵行動就是按一下幫我分享或留言,感恩喔~

點我分享到Facebook

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *