我在Qt中有一个MainWindow类,其中放置了几个可检查的QGroupBox小部件。
我想要做的是,每当单击onClick对象的一个(any)时,就触发一个通用的QGroupBox (Bool)槽,标识发送方并触发一些代码。
我需要捕获对象的“单击”信号,以防止它在单击控件时对其子控件执行禁用操作。
这是我要处理的信号:
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类中处理控件类型的默认行为。
谢谢你事先提出的任何想法。
发布于 2017-02-27 20:12:18
@Kuba,也许你是对的,我不能单独而清楚地陈述我的问题和围绕它的事实。谢谢你指出这一点。
在签出QGroupBox类的源之后,我发现在“单击”事件中的每一个其他操作之后都会发出一个“切换”信号。
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的“切换”信号连接到一个常见的“主窗口::onToggle”槽中,我可以在其中处理我想要的事件后操作。
至于我以前的方法,我可以创建一个继承QGroupBox并覆盖任何我希望的方法的类。但与我目前的解决方案相比,这太过分了。我想出的解决办法完美地发挥了作用。
感谢大家的洞察力和帮助。
发布于 2017-02-27 14:02:30
我需要捕获对象的“单击”信号,以防止它在单击控件时对其子控件执行禁用操作。
也许吧,但我闻到了XY问题的味道。您当然可以通过在小部件上调用blockSignals()来防止信号的释放。但这是一个黑客-它还将阻止Qt的内部操作对象的destroyed()信号,您可能会微妙地破坏其他用户的对象的信号。
相反,可以使UI有状态,并让控制器实现按钮与应用程序其余部分交互的有状态方面。目前,按钮的clicked()信号直接连接到其他用户。相反,将按钮连接到控制器,并让控制器只在适当的时候禁用子控制器。可以使用QStateMachine使这种有状态行为在状态方面显式化。
https://stackoverflow.com/questions/42481958
复制相似问题