我在Qt中有一个MainWindow类,其中放置了几个可检查的QGroupBox小部件。
我想要做的是,只要点击一个(任何)QGroupBox对象,就触发一般onClick(bool checked)插槽,识别发件人并触发一些代码。
我需要捕获对象的“单击”信号,以防止在单击控件时对其子项执行的禁用操作。
这是我想要处理的信号:
class Q_WIDGETS_EXPORT QGroupBox : public QWidget
{
...
Q_SIGNALS:
void clicked(bool checked = false);
...
};
我尝试添加这样的自定义插槽并尝试将其与上面的信号连接,但由于QGroupBox本身不是对象或指针,因此操作失败。
void MainWindow::onClick(bool clicked)
{
qDebug()<<"Custom slot triggered";
}
长话短说,我需要在MainWindow类中处理控件类型的默认行为。
提前感谢任何想法。
答案 0 :(得分:2)
我需要捕捉物体&#39; &#34;点击的&#34;信号,以防止它在单击控件时对其子项执行的禁用操作。
也许,但我在这里闻到XY Problem。您当然可以通过在窗口小部件上调用blockSignals()
来阻止信号的发射。但这是一个黑客攻击 - 它也会阻止Qt的内部对象的destroyed()
信号进行操作,你可能会巧妙地打破对象信号的其他用户。
相反,可以使UI处于有状态并让控制器实现按钮与应用程序其余部分的交互的有状态方面。目前,按钮的clicked()
信号直接连接到其他用户。相反,将按钮连接到控制器,并让控制器仅在适合的情况下禁用子项。可以使用QStateMachine
在状态方面明确表达这种有状态行为。
答案 1 :(得分:0)
签出QGroupBox课程后#39;来源,我发现了一个&#34;切换&#34;在&#34;点击&#34;中的每个其他操作之后发出信号。事件
http://code.qt.io/cgit/qt/qtbase.git/tree/src/widgets/widgets/qgroupbox.cpp
void QGroupBox::setChecked(bool b)
{
Q_D(QGroupBox);
if (d->checkable && b != d->checked) {
update();
d->checked = b;
d->_q_setChildrenEnabled(b);
#ifndef QT_NO_ACCESSIBILITY
QAccessible::State st;
st.checked = true;
QAccessibleStateChangeEvent e(this, st);
QAccessible::updateAccessibility(&e);
#endif
emit toggled(b);
}
}
通过将此信息与@rbaleksandar的建议相结合,我设法获得了解决方案。
我遍历了我的MainWindow类的控件,并连接了每个QGroupBox&#34;&#34; toggle&#34;用一个共同的信号&#34; MainWindow :: onToggle&#34;我可以处理我想要的事后操作的插槽。
至于我之前的方法,我可以创建一个继承QGroupBox并覆盖我想要的任何方法的类。但与我目前的解决方案相比,这将是过度的。我提出的解决办法完美无缺。
感谢大家的见解和帮助。