首页 > 解决方案 > 为什么在未选中的 QGroupBox 中启用了我的子小部件?

问题描述

当我在取消选中组框后启用我的孩子时,该孩子已启用QGroupBox 但是,如果我对孙小部件执行相同操作,则该小部件仍处于禁用状态。我希望未选中的组框的所有子项与禁用的父窗口小部件的所有子项(关于启用)的行为相同。

在未选中的组框中启用子项

用于创建上述图像的代码要点。

我应该怎么做才能确保我的孩子自动保持禁用状态,即使我child.setEnabled(true)在取消选中分组框后打电话也是如此?

我正在使用 Qt 5.9.1。

标签: c++qtqwidgetqt5.9qgroupbox

解决方案


发生这种情况是因为当复选框关闭时 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();
}

推荐阅读