Когда я включаю ребенка моего QGroupBox
после сняв флажок группы, этот ребенок включен. Но если я сделаю то же самое с виджетом внука, этот виджет останется отключенным. Я ожидал бы, что все дочерние элементы неконтролируемого группового блока будут действовать так же, как и все дочерние элементы отключенного родительского виджета (относительно включения).
Суть кода, использованного для создания изображения выше.
Что я должен сделать, чтобы мой ребенок автоматически оставался инвалидом, даже если я позвоню child.setEnabled(true)
после того, как флажок группы снят?
Я использую Qt 5.9.1.
Это похоже на известная ошибка.
На данный момент вам нужно знать, установлен ли флажок родительской группы для вызова setEnabled
на дочернем виджете:
child.setEnabled(groupBox.isChecked() && otherCondition);
Это происходит потому, что 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();
}