当我在取消选中组框后启用我的孩子时,该孩子已启用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();
}
这似乎是一个已知的错误。
目前,您需要知道是否选中了父组框以调用setEnabled
子窗口小部件:
child.setEnabled(groupBox.isChecked() && otherCondition);