QGroupBox: Exclude top level widgets from child event handling.

Prevent the QGroupBox from changing the enabled state of
dialogs parented on it.

Task-number: QTBUG-40132
Change-Id: I91cc6ccf5ade0b3a491020ed947d4aceca62d7b6
Reviewed-by: J-P Nurmi <jpnurmi@digia.com>
This commit is contained in:
Friedemann Kleint 2014-07-15 11:04:07 +02:00
parent 08fd2a724d
commit 45854c75aa
2 changed files with 21 additions and 0 deletions

View File

@ -405,6 +405,8 @@ void QGroupBox::childEvent(QChildEvent *c)
if (c->type() != QEvent::ChildAdded || !c->child()->isWidgetType())
return;
QWidget *w = (QWidget*)c->child();
if (w->isWindow())
return;
if (d->checkable) {
if (d->checked) {
if (!w->testAttribute(Qt::WA_ForceDisabled))

View File

@ -46,6 +46,7 @@
#include <QStyleOptionGroupBox>
#include <QVBoxLayout>
#include <QRadioButton>
#include <QDialog>
#include "qgroupbox.h"
@ -71,6 +72,7 @@ private slots:
void setChecked_data();
void setChecked();
void enabledPropagation();
void enabledChildPropagation();
void sizeHint();
void toggled();
void clicked_data();
@ -288,6 +290,23 @@ void tst_QGroupBox::enabledPropagation()
delete testWidget;
}
void tst_QGroupBox::enabledChildPropagation()
{
QGroupBox testWidget;
testWidget.setCheckable(true);
testWidget.setChecked(true);
// The value of isChecked() should be reflected in the isEnabled() of newly
// added child widgets, but not in top level widgets.
QWidget *childWidget = new QWidget(&testWidget);
QVERIFY(childWidget->isEnabled());
QDialog *dialog = new QDialog(&testWidget);
QVERIFY(dialog->isEnabled());
testWidget.setChecked(false);
childWidget = new QWidget(&testWidget);
QVERIFY(!childWidget->isEnabled());
dialog = new QDialog(&testWidget);
QVERIFY(dialog->isEnabled());
}
void tst_QGroupBox::sizeHint()
{