我正在尝试将加速器连接到Gtk :: ToggleToolButton,不幸的是“切换”信号不是“可激活的”,所以你必须连接到“clicked”而不是这样:
togglebutton->add_accelerator("clicked", ...etc..)
这可以工作,并触发连接到signal_clicked()的任何处理程序但是,它实际上不会改变按钮的外观,或者触发“切换”信号。基本上点击“点击”不会改变按钮的“活动”状态。
因此,显而易见的解决方案是从“clicked”回调中调用toolbutton-> set_active(true / false)。但现在的问题是set_active本身会触发“clicked”信号和“toggled”信号,所以你最终会陷入无限循环:
accelerator -> clicked handler -> set_active() -> clicked handler -> set_active()
所以,我的问题是,如何在ToggleToolButton中添加加速器,从而导致切换按钮的预期行为?
答案 0 :(得分:2)
这可以工作,并触发连接到signal_clicked()的任何处理程序但是,它实际上不会改变按钮的外观,或者触发“切换”信号。
我不确定这是否正确。 clicked
的默认ToggleButton
处理程序似乎会导致toggled
信号被触发,并且外观会按预期更改。
但是如果您手动连接到clicked
信号,并且没有链接到默认处理程序,那么就可以阻止这种情况发生!我花了一点时间来解决这个问题。我确定如何在gtkmm中进行链接(我通常使用C或Vala进行GTK工作),但这并不重要,因为你可以让默认处理程序到它的东西并连接到{ {1}}就像你想要的那样。
这是我使用的测试代码:
toggled
答案 1 :(得分:2)
神秘解决了!
感谢Twitter上的@conscioususer:https://twitter.com/conscioususer/statuses/396397287288889344
事实证明,Gtk :: ToggleToolButton实际上是一个带有子ToggleButton的ToolButton。使其工作的方法是将加速器连接到子窗口小部件(例如toggletoolbutton->get_child()->add_accelerator("clicked", ...)
),然后一切都按预期工作!