2

Glade、GtkBuilder、および C を使用して、GTK で簡単なテキスト エディターを (演習として) 作成しています。テキスト用の GtkTextView だけでなく、切り取り、コピー、貼り付けの編集メニューもあります。GtkTextView は、カット/コピー/ペースト シーケンスをそれ自体に自動的にバインドします (さらに、右クリックするとメニュー項目が表示されます)。メニュー バーの [切り取り]、[コピー]、および [貼り付け] メニュー項目をテキスト ビューに接続して、期待どおりに動作させたいと考えています。

これは双方向接続であることに注意してください。(1) 切り取り、コピー、または貼り付けの GtkMenuItem のいずれかがアクティブになると、GtkTextView に何かを行うように指示します。(2) GtkTextView で選択が行われるかクリアされると、Cut と Copy がそれぞれ有効または無効になります (例として gedit を参照)。また、(3) Paste が有効かどうかは、クリップボードの状態によって異なります。

切り取り、コピー、貼り付けのメニュー項目をテキスト ビューに接続するにはどうすればよいですか? Glade でそれを行う方法はありますか、それとも C プログラムでこれを行うには追加のコードが必要ですか? これを行う合理化された方法はありますか、または上記の段落に記載されている 3 つの動作すべてを手動で実装する必要がありますか?

4

1 に答える 1

2

追加の C コードが必要になりますが、それほど多くはありません。この例ではGtkAction、メニュー項目に s を使用していると想定していますが、そうでない場合の解決策も同様です。

まず、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);
}

次に、あなたのnotify::has-selection信号に接続しますGtkTextBuffer

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

これは、ユーザーがクリップボードを手動でクリアする方法がないことを前提としています (ほとんどのプログラムでは、これを行うことはできません)。

警告: ここに入力されたコードはすべてテストされていません。

于 2010-01-23T10:35:54.720 に答える