2010-01-23 39 views
2

我正在GTK中使用Glade,GtkBuilder和C編寫一個簡單的文本編輯器(作爲練習)。我有一個包含剪切,複製和粘貼的編輯菜單以及一個GtkTextView文本。 GtkTextView會自動綁定剪切/複製/粘貼序列(如果您點擊右鍵,甚至會提供菜單項)。我想將菜單欄中的「剪切」,「複製」和「粘貼」菜單項連接到我的文本視圖,以便它們按預期行事。如何將GtkTextView連接到GtkMenuItem

請注意,這是一個雙向連接。 (1)當其中一個Cut,Copy或Paste GtkMenuItem被激活時,它告訴GtkTextView做一些事情。 (2)當在GtkTextView中進行選擇或清除時,分別啓用或禁用剪切和複製(請參閱gedit作爲示例)。此外,(3)是否啓用粘貼取決於剪貼板的狀態。

如何將我的剪切,複製和粘貼菜單項連接到文本視圖?有沒有辦法做到這一點在格萊德,或者我的C程序需要一些額外的代碼呢?有沒有簡化的方法來做到這一點,還是我需要手動實現上述段落中陳述的所有三種行爲?

回答

2

您將需要一些額外的C代碼,但不多。對於這個例子,我假設你使用GtkAction作爲你的菜單項,但如果你不是解決方案應該是類似的。

首先在Glade中製作剪切,複製和粘貼操作的回調。在連接信號時,將至少包含指向剪切,複製和粘貼操作的指針以及文本視圖的數據結構傳遞爲用戶數據。

void 
on_cut(GtkAction *action, SomeStruct *data) 
{ 
    g_signal_emit_by_name(data->view, "cut-clipboard", NULL); 
    gtk_action_set_sensitive(data->paste_action, TRUE); 
} 

void 
on_copy(GtkAction *action, SomeStruct *data) 
{ 
    g_signal_emit_by_name(data->view, "copy-clipboard", NULL); 
    gtk_action_set_sensitive(data->paste_action, TRUE); 
} 

void 
on_paste(GtkAction *action, SomeStruct *data) 
{ 
    g_signal_emit_by_name(data->view, "paste-clipboard", NULL); 
} 

接下來,連接到您的GtkTextBuffernotify::has-selection信號:

void 
on_has_selection_notify(GtkTextBuffer *buffer, GParamSpec *pspec, SomeStruct *data) 
{ 
    gboolean has_selection = gtk_text_buffer_get_has_selection(buffer); 
    gtk_action_set_sensitive(data->cut_action, has_selection); 
    gtk_action_set_sensitive(data->copy_action, has_selection); 
} 

要確定粘貼動作的初始狀態(如果存在剪貼板上的文字,當你啓動應用程序)運行當您構建您的界面時,請使用以下代碼:

gtk_action_set_sensitive(data->paste_action, 
    gtk_clipboard_wait_is_text_available(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD))); 

這假設用戶無法手動清除剪貼板(大多數程序不會讓你這樣做。)

注意:這裏鍵入的代碼都是未經測試的。

+0

謝謝,這工作(我不知道起初你可以通過「通知::屬性名稱」連接到一個屬性)。不過,我想我找到了更好的方式來處理剪貼板:連接到剪貼板的「所有者更改」信號。每次剪貼板更新時,該信號似乎都會發出。在我的系統中,這適用於所有我能想到的邊緣情況。 – 2010-01-25 06:42:11