Почему мой дочерний виджет включен внутри непроверенного QGroupBox?

Когда я включаю ребенка моего QGroupBox после сняв флажок группы, этот ребенок включен. Но если я сделаю то же самое с виджетом внука, этот виджет останется отключенным. Я ожидал бы, что все дочерние элементы неконтролируемого группового блока будут действовать так же, как и все дочерние элементы отключенного родительского виджета (относительно включения).

Включен ребенок в непроверенном групповом поле

Суть кода, использованного для создания изображения выше.

Что я должен сделать, чтобы мой ребенок автоматически оставался инвалидом, даже если я позвоню child.setEnabled(true) после того, как флажок группы снят?

Я использую Qt 5.9.1.

0

Решение

Это похоже на известная ошибка.

На данный момент вам нужно знать, установлен ли флажок родительской группы для вызова setEnabled на дочернем виджете:

child.setEnabled(groupBox.isChecked() && otherCondition);
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();
}
0

По вопросам рекламы [email protected]