用于9个按钮的单个处理程序(gtkmm-2、libsigc+;+;)

用于9个按钮的单个处理程序(gtkmm-2、libsigc+;+;),gtk,signals,gtkmm,libsigc++,Gtk,Signals,Gtkmm,Libsigc++,我正在尝试制作一个带有9个切换按钮(3行3列)的小部件,用户可以选择其中一个。因此,我编写了9个事件处理程序,它禁用了当前选择的按钮并存储选择 我只是想知道是否有办法将这9个切换按钮连接到一个处理器,是否有办法知道哪个按钮发出了信号。类似于QT的东西 QObject::sender() 这样可以避免代码中的大量重复。正如标题中提到的,我使用的是gtkmm版本2,当然还有sigc++ 感谢您的建议我对gtkmm不太熟悉,但在普通C GTK中,信号处理程序如下所示: void on_button_

我正在尝试制作一个带有9个切换按钮(3行3列)的小部件,用户可以选择其中一个。因此,我编写了9个事件处理程序,它禁用了当前选择的按钮并存储选择

我只是想知道是否有办法将这9个切换按钮连接到一个处理器,是否有办法知道哪个按钮发出了信号。类似于QT的东西

QObject::sender()
这样可以避免代码中的大量重复。正如标题中提到的,我使用的是gtkmm版本2,当然还有sigc++


感谢您的建议

我对gtkmm不太熟悉,但在普通C GTK中,信号处理程序如下所示:

void on_button_toggled (GtkToggleButton *button, gpointer user_data);

按钮
指针是QT术语中的“发送者”。要找出哪个按钮是哪个按钮,您可以命名它们,或者使用
g_object\u set_data()

附加数据。我对gtkmm不太熟悉,但在普通的C GTK中,信号处理程序如下所示:

void on_button_toggled (GtkToggleButton *button, gpointer user_data);

按钮
指针是QT术语中的“发送者”。要找出哪个按钮是哪个按钮,可以命名它们,或者使用
g\u object\u set\u data()

附加数据。我使用c++11 lambdas解决了类似的问题。基本上,您可以在lambda中捕获有关目标的信息,因此当信号触发时,您可以执行特定于目标的操作。例如:

abutton.signal_clicked().connect([this,&abutton]{ handle_click(abutton); });

我相信这将适用于gtkmm 2.x,但我只在3.0中使用过它,我不知道sigc++在这两个版本之间是如何变化的。如果您不能使用c++11特性,您可能可以使用sigc++附带的lambda功能来执行类似的操作,但我没有使用它的经验

我使用c++11 lambdas解决了一个类似的问题。基本上,您可以在lambda中捕获有关目标的信息,因此当信号触发时,您可以执行特定于目标的操作。例如:

abutton.signal_clicked().connect([this,&abutton]{ handle_click(abutton); });

我相信这将适用于gtkmm 2.x,但我只在3.0中使用过它,我不知道sigc++在这两个版本之间是如何变化的。如果您不能使用c++11特性,您可能可以使用sigc++附带的lambda功能来执行类似的操作,但我没有使用它的经验

按钮->信号点击().connect(sigc::bind(sigc::mem\u-fun(*this,&MyWidget::on\u-button\u-clicked),*按钮));在Gtkmmbutton->signal_clicked().connect(sigc::bind(sigc::mem_-fun(*这个,&MyWidget::on_-button_-clicked),*按钮));在GTKmmanos中,@ivarpois对ptomato的答案的评论给出了另一种方式,这里也是我的答案:另一种方式是@ivarpois对ptomato的答案的评论,这里也是我的答案: