4

要旨

handler_blockケースバイケースで便利ですが、プログラムの最初で何かを呼び出してgtk_entry_set_text、gtk_toggle_button_set_activeへのすべての呼び出しのシグナルを抑制したいと思います。方法はありますか?


背景情報

私のプログラムは、次の属性を持つキャラクター作成者ダイアログボックスを介してエンティティを作成するために使用されます。


名前-GTKComboBoxesアニメーション を介して所定のリストから選択 -GTKComboBox
グループ-エンティティを分類する6つのラジオボタンの1つ

エンティティを追加できます。1つは空白の[追加]ダイアログで始まり、すべてのフィールドに入力して送信します。
エンティティは、[編集]ダイアログで編集できます。このダイアログでは、上記のすべてのフィールドに、エンティティの現在の属性が最初に入力されます。編集は瞬時に行われ([編集]ダイアログに[送信]ボタンはありません)、コンボボタンまたはラジオボタンから新しい値を選択するとすぐに、表示されるエンティティが異なって表示されます。

Typeエントリに接続され、「changed」シグナルによってトリガーされるコールバックがあります。編集中のエンティティを表示するためにコードでエントリテキストを手動で設定すると、コールバックがトリガーされるようです。

gtk_entry_set_text(GTK_ENTRY(name_entry), entity.name); // name is a char*
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (group_button_friendly), TRUE);

ええ、で方法がありますがg_signal_handler_block、それは必要です

1)gulong最初に信号を接続したときに作成されるを取得します。 g_signal_connect(args); 対。 gulong entry_handler_id = g_signal_connect(args);

2)すべての呼び出しにブロック/ブロック解除イディオムを使用します。
g_signal_handler_block(args, entry_handler_id);
gtk_entry_set_text(args);
g_signal_handler_unblock(args, entry_handler_id);
またはさらに悪いことに、
g_signal_handler_block(args, entry_handler_id);
fn_that_calls_gtk_entry_set_text();
g_signal_handler_unblock(args, entry_handler_id);

4

1 に答える 1

1

あなたが探しているのはですg_signal_handlers_block_matched。シグナルで使用されているクロージャーだけにマスクを設定するG_SIGNAL_MATCH_CLOSUREと、うまくいくはずです。

発信されているシグナルを検索するsignal_id必要がありますが、シグナルIDはすべてのウィジェット間で同じであるため、これを1回だけ実行する必要があります。これが、呼び出しでもインスタンスが必要な理由です。

そして、ブロックを解除するには、を使用しますg_signal_handlers_unblock_matched

于 2012-11-14T23:35:42.290 に答える