Fix propagation of locale from widget to its children

Fix the condition in QWidgetPrivate::resolveLocale() to decide whether
to propagate locale: make it match setLocale_helper()'s condition when
deciding whether to propagate to descendants.  This lead to a
QDateTimeEdit's calendar popup not getting told what locale to use
correctly, unless we setLocale() on it overtly, which then blocked
propagation of locale changes to it unless QDateTimeEdit manually
propagated the changes.

Fix the documentation of WA_WindowPropagation to mention locale as
also being propagated (which it was in several places, only neglecting
this one in resolveLocale).

[ChangeLog][QWidget][Qt::WA_WindowPropagation] Propagate locale
consistently, along with font and palette, within the widget
hierarchy.  Previously, locale was propagated on ancestral
setLocale(), but not on creation of the descendant.

Task-number: QTBUG-59106
Change-Id: I92270f7789c8eda66a458274a658c84c7b0df754
Reviewed-by: David Faure <david.faure@kdab.com>
This commit is contained in:
Edward Welbourne 2017-03-03 14:40:40 +01:00
parent d82d2f6716
commit e5c0371d18
3 changed files with 31 additions and 3 deletions

View File

@ -1151,8 +1151,8 @@
and Windows) the window will take a modified appearance. This flag is set
or cleared by QWidget::setWindowModified().
\value WA_WindowPropagation Makes a toplevel window inherit font and
palette from its parent.
\value WA_WindowPropagation Makes a toplevel window inherit font, palette
and locale from its parent.
\value WA_MacAlwaysShowToolWindow On \macos, show the tool window even
when the application is not active. By default, all tool windows are

View File

@ -5993,7 +5993,7 @@ void QWidgetPrivate::resolveLocale()
Q_Q(const QWidget);
if (!q->testAttribute(Qt::WA_SetLocale)) {
setLocale_helper(q->isWindow()
setLocale_helper(q->isWindow() && !q->testAttribute(Qt::WA_WindowPropagation)
? QLocale()
: q->parentWidget()->locale());
}

View File

@ -277,6 +277,7 @@ private slots:
#endif
void setLocale();
void propagateLocale();
void deleteStyle();
void multipleToplevelFocusCheck();
void setFocus();
@ -1203,6 +1204,33 @@ void tst_QWidget::setLocale()
QCOMPARE(child2.locale(), QLocale(QLocale::French));
}
void tst_QWidget::propagateLocale()
{
QWidget parent;
parent.setLocale(QLocale::French);
// Non-window widget; propagates locale:
QWidget *child = new QWidget(&parent);
QVERIFY(!child->isWindow());
QVERIFY(!child->testAttribute(Qt::WA_WindowPropagation));
QCOMPARE(child->locale(), QLocale(QLocale::French));
parent.setLocale(QLocale::Italian);
QCOMPARE(child->locale(), QLocale(QLocale::Italian));
delete child;
// Window: doesn't propagate locale:
child = new QWidget(&parent, Qt::Window);
QVERIFY(child->isWindow());
QVERIFY(!child->testAttribute(Qt::WA_WindowPropagation));
QCOMPARE(child->locale(), QLocale());
parent.setLocale(QLocale::French);
QCOMPARE(child->locale(), QLocale());
// ... unless we tell it to:
child->setAttribute(Qt::WA_WindowPropagation, true);
QVERIFY(child->testAttribute(Qt::WA_WindowPropagation));
QCOMPARE(child->locale(), QLocale(QLocale::French));
parent.setLocale(QLocale::Italian);
QCOMPARE(child->locale(), QLocale(QLocale::Italian));
}
void tst_QWidget::visible_setWindowOpacity()
{
QScopedPointer<QWidget> testWidget(new QWidget);