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

Changing the behavior of a widget type in another class

本文关键字:小部 类型 一类      更新时间:2023-10-16

我在QT中有一个MainWindow类,其中放置了几个可校准的Qgroupbox小部件。

我要做的是,单击QGroupBox对象的一个(任何)时,触发一般的ONCLICK(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类中处理控制类型的默认行为。

感谢提前的任何想法。

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

也许,但是我在这里闻到了一个XY问题。您当然可以通过在小部件上调用blockSignals()来防止发射信号。但这是一个黑客 - 它也将防止QT的内部元素在对象的destroyed()信号上作用,并且您可能会巧妙地打破对象信号的其他用户。

相反,可以使UI状态实现,并使控制器实现按钮与应用程序其余部分的交互的状态方面。当前,该按钮的clicked()信号直接连接到其他用户。取而代之的是,将按钮连接到控制器,并使控制器仅在适当的情况下禁用孩子。一个人可以使用QStateMachine来使这种状态的行为明确地从状态下明确。

@kuba ober,也许你是对的,我无法单独而清晰地陈述我的问题以及周围的事实。谢谢您指出的。

检查了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的建议相结合,我设法获得了解决方案。

i通过我的MainWindow类的控件进行了迭代,并将每个Qgroupbox的"切换"信号与一个通用的" MainWindow :: OnToggle"插槽连接起来,我可以处理我想要的事后操作。

>

至于我以前的方法,我可以创建一个继承qgroupbox并覆盖我想要的任何方法的类。但这与我当前的解决方案相比,这将是过度的。我想出的修复程序完美地做到了。

感谢大家的见识和帮助。