在另一类中更改小部件类型的行为
Changing the behavior of a widget type in another class
我在QT中有一个MainWindow类,其中放置了几个可校准的Qgroupbox小部件。
我要做的是,单击QGroupBox对象的一个(任何)时,触发一般的ONCLICK(BOOL检查)插槽。> 我需要捕获对象的"单击"信号,以防止在单击控件时对其对孩子执行的禁用动作。 这是我要处理的信号: 我尝试添加这样的自定义插槽,并尝试将其与上面的信号连接起来,但是由于qgroupbox本身不是对象或指针,因此操作失败了。 长话短说,我需要在MainWindow类中处理控制类型的默认行为。 感谢提前的任何想法。class Q_WIDGETS_EXPORT QGroupBox : public QWidget
{
...
Q_SIGNALS:
void clicked(bool checked = false);
...
};
void MainWindow::onClick(bool clicked)
{
qDebug()<<"Custom slot triggered";
}
我需要捕获对象的"单击"信号,以防止在单击控件时对其对孩子执行的禁用动作。
也许,但是我在这里闻到了一个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并覆盖我想要的任何方法的类。但这与我当前的解决方案相比,这将是过度的。我想出的修复程序完美地做到了。
感谢大家的见识和帮助。
- QT如何检查表格小部件类型
- 使用类型特征的部分类专用化
- 如何以类型的安全方式分配UINT32_T :: MAX和UINT64_T的最小值
- 如何计算浮点数据类型的范围、最大值、最小值
- 根据浮点数选择最小整数类型
- 从模板继承<类型名 T、T 最大值、T 最小值>具有多个类型名模板参数的结构
- 从较小类型的指针定义的范围构造向量
- 为什么 std::ssize 被强制为其有符号大小类型的最小大小
- 针对多种类型的部分类模板专用化
- 写一个最小的自定义操作员:std :: Sort需要std :: __ lg为我的类型解释
- 在磁盘上写作时,我应该使用最小的类型
- 在另一类中更改小部件类型的行为
- 类型 *阵列的最小或最大值的类功能 *
- 小标量类型和谷歌协议缓冲区
- C++ 创建小部件数组
- 查找最多可以计数到 N 的最小整数类型
- 将字节从较小的类型复制到较大的类型
- Qt:如何为所有小部件和小部件类型实现通用基类信号/插槽功能(通过虚拟基类插槽)
- 使用小数据类型是否会减少内存使用(来自内存分配而不是效率)
- 将大数字类型转换为较小的类型