gtkのラジオボタンまたはgtkトグルボタンの "up/down"状態を切り替えるgtkのビルトインハンドラへの「クリック」信号のブロックをブロックすることはできますか?GTK +はgtk_radio_buttonまたはgtk_toggle_buttonのデフォルトハンドラをオーバーライドします
背景:
私はネットワーク接続を介してオンとオフ、ハードウェアのGPIOピンをオンにする必要があります(Linuxの& OS Xのために、Cで)GTKアプリケーションに取り組んでいます。メッセージを送信することによって、ピンがオンまたはオフになります(つまり、イベントドリブンです)。ハードウェアは、ハードウェアピンの実際の状態を示すメッセージを定期的に返します。ピンの真の状態が、 (ユーザーの選択状態とは異なる理由がいくつかありますが、私はここには入りません)。私は現在、GTKラジオボタンを使用してピンをオン/オフしています。私はこのように設定しました:
void create_control_buttons(control_t *item)
{
assert(item != NULL);
// Create grouped Gtk radio buttons.
item->button0 = gtk_radio_button_new_with_label(NULL, "Off");
item->button1 = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(item->button0), "On");
// Make the radio buttons look like normal buttons.
gtk_toggle_button_set_mode(GTK_TOGGLE_BUTTON(item->button0), FALSE);
gtk_toggle_button_set_mode(GTK_TOGGLE_BUTTON(item->button1), FALSE);
g_signal_connect(G_OBJECT(item->button0), "clicked", G_CALLBACK(on_control_clicked), (gpointer)item);
g_signal_connect(G_OBJECT(item->button1), "clicked", G_CALLBACK(on_control_clicked), (gpointer)item);
}
void on_control_clicked(GtkWidget *widget, gpointer user_data)
{
control_t *item = user_data;
assert(item != NULL);
if (widget == item->button0) {
// Send 'off' signal
} else if (widget == item->button1) {
// send 'on' signal
}
}
定期的なステータスメッセージがハードウェアから返されると、別の関数が呼び出されます。それはこのようにボタンの状態を更新します。
if (state == ON) {
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(item->button1), 1);
} else {
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(item->button0), 1);
}
コードは動作しますが、2つの問題がある:ラジオボタンの状態が変更した場合、それは2つのメッセージを送信し 1.。 2.ボタンは「クリック」した直後に状態を変更しますが、ハードウェアのピンの状態が異なる場合は再び元の状態に戻ります。
リモートの状態を反映するために通常のgtkボタンや他のタイプのウィジェットでこれを行うことができましたが、私は本当にオン/オフボタンを押して "美しい/美しい"人間工学的理由。
gtkはボタンの状態を内部的に更新するのを止める方法があるので、gtk_toggle_button_set_active()で更新するだけですか?
私の知らないことを許してください、私はGTKにはかなり新しく、おそらくこれには本当に明白な解決策がありますが、私は時間を費やしてグーグルで別のものを試してみると、カスタムウィジェットを書く。
あなたのラジオボタンは状態を示すためにのみ表示されていますが、ユーザーはそれらを変更できませんか?もしそうなら、間違ったツールを使って仕事をしているかもしれません。 GtkDrawingAreaを使って状態を描画し、 'gtk_widget_queue_draw()'を使って調べてみましょう。 – andlabs
こんにちはandlabs、彼らは両方を行う必要はありません:状態を変更&表示する、それはちょうど2つが「デカップリング」する必要があることです。 – Halzephron