为什么在未选中的QGroupBox中启用我的子窗口小部件?

时间:2018-06-21 16:35:08

标签: c++ qt qwidget qt5.9 qgroupbox

在取消选中组框后启用QGroupBox 的子级时,该子级被启用。但是,如果我对孙部件执行相同的操作,则该部件将保持禁用状态。我希望未选中的组框的所有子项都与禁用的父窗口小部件的所有子项(就被启用而言)一样。

Enabled child in an unchecked group box

Gist的用于创建上方图像的代码。

即使取消选中组框后打电话给child.setEnabled(true),我该怎么做以确保孩子自动保持残疾?

我正在使用Qt 5.9.1。

2 个答案:

答案 0 :(得分:0)

这似乎是known bug

此刻,您需要知道是否选中了父组框以调用子小部件上的setEnabled

child.setEnabled(groupBox.isChecked() && otherCondition);

答案 1 :(得分:0)

之所以会发生这种情况,是因为当复选框处于关闭状态时,QGroupBox本身并未被禁用,因此正常的窗口小部件启用传播不适用于此行为。此解决方法是恕我直言明智的。通过公共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();
}