首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更改另一个类中小部件类型的行为

更改另一个类中小部件类型的行为
EN

Stack Overflow用户
提问于 2017-02-27 09:23:39
回答 2查看 144关注 0票数 0

我在Qt中有一个MainWindow类,其中放置了几个可检查的QGroupBox小部件。

我想要做的是,每当单击onClick对象的一个(any)时,就触发一个通用的QGroupBox (Bool)槽,标识发送方并触发一些代码。

我需要捕获对象的“单击”信号,以防止它在单击控件时对其子控件执行禁用操作。

这是我要处理的信号:

代码语言:javascript
复制
class Q_WIDGETS_EXPORT QGroupBox : public QWidget
{
    ...
    Q_SIGNALS:
        void clicked(bool checked = false);
    ...
};

我尝试添加这样的自定义插槽,并尝试将其与上面的信号连接,但由于QGroupBox本身不是对象或指针,操作失败。

代码语言:javascript
复制
void MainWindow::onClick(bool clicked)
{
    qDebug()<<"Custom slot triggered";
}

长话短说,我需要在我的MainWindow类中处理控件类型的默认行为。

谢谢你事先提出的任何想法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-27 20:12:18

@Kuba,也许你是对的,我不能单独而清楚地陈述我的问题和围绕它的事实。谢谢你指出这一点。

在签出QGroupBox类的源之后,我发现在“单击”事件中的每一个其他操作之后都会发出一个“切换”信号。

http://code.qt.io/cgit/qt/qtbase.git/tree/src/widgets/widgets/qgroupbox.cpp

代码语言:javascript
复制
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并覆盖任何我希望的方法的类。但与我目前的解决方案相比,这太过分了。我想出的解决办法完美地发挥了作用。

感谢大家的洞察力和帮助。

票数 0
EN

Stack Overflow用户

发布于 2017-02-27 14:02:30

我需要捕获对象的“单击”信号,以防止它在单击控件时对其子控件执行禁用操作。

也许吧,但我闻到了XY问题的味道。您当然可以通过在小部件上调用blockSignals()来防止信号的释放。但这是一个黑客-它还将阻止Qt的内部操作对象的destroyed()信号,您可能会微妙地破坏其他用户的对象的信号。

相反,可以使UI有状态,并让控制器实现按钮与应用程序其余部分交互的有状态方面。目前,按钮的clicked()信号直接连接到其他用户。相反,将按钮连接到控制器,并让控制器只在适当的时候禁用子控制器。可以使用QStateMachine使这种有状态行为在状态方面显式化。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42481958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档