c++ - 为什么在未选中的 QGroupBox 中启用了我的子小部件?
问题描述
当我在取消选中组框后启用我的孩子时,该孩子已启用QGroupBox
。但是,如果我对孙小部件执行相同操作,则该小部件仍处于禁用状态。我希望未选中的组框的所有子项与禁用的父窗口小部件的所有子项(关于启用)的行为相同。
用于创建上述图像的代码要点。
我应该怎么做才能确保我的孩子自动保持禁用状态,即使我child.setEnabled(true)
在取消选中分组框后打电话也是如此?
我正在使用 Qt 5.9.1。
解决方案
发生这种情况是因为当复选框关闭时 aQGroupBox
本身没有被禁用,因此正常的小部件启用传播不适用于此行为。恕我直言,这种解决方法是明智的。通过公共 API 唯一可能的解决方法是在组框中添加一个视口子小部件,并使所有内容成为该视口的子小部件:
class GroupBoxViewport : public QWidget {
Q_OBJECT
void updateGeometry() {
if (parent())
setGeometry(parentWidget()->contentsRect());
}
void newParent() {
if (parent()) {
parent()->installEventFilter(this);
updateGeometry();
}
}
protected:
bool eventFilter(QObject *obj, QEvent *ev) override {
if (obj == parent() && ev->type() == QEvent::Resize)
updateGeometry();
return QWidget::eventFilter(obj, ev);
}
bool event(QEvent *ev) override {
if (ev->type() == QEvent::ParentAboutToChange) {
if (parent())
parent()->uninstallEventFilter(this);
} else if (ev->type() == QEvent::ParentChange)
newParent();
return QWidget::event(ev);
}
public:
QWidget(QWidget *parent = {}) : QWidget(parent) {
newParent();
}
};
然后,设置布局并将所有子项添加到视口:
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QGroupBox box("The Group");
GroupBoxViewPort viewport(&box);
QVBoxLayout layout(&viewport);
QLabel label("A, uh, member of the group");
layout.addwidget(&label);
box.show();
return app.exec();
}
推荐阅读
- django - Postgresql 通过 sql 脚本更新,在后端获取通知
- css - MS Edge 上的 CSS 边框问题
- python - 您如何为实时系统实现 Python Gekko 应用程序?
- windows - Windows 10:将 Acrobat Reader 设置为批处理文件中的默认 PDF 阅读器
- android - 有没有办法通过来自服务器的 API 来监听 json 的变化?
- javascript - 在任何其他方法之前运行 for 循环中的第一个 fetch 方法
- sql - 使用 order by 更新查询
- c++ - 如何使用 g++ 安装“Seshat”
- java - 为什么我不能用 OpenJFX 和 Deeplearning4J 编译 maven?
- javascript - 如何替换列表中特定索引处的元素