diff options
-rw-r--r-- | src/gui/kernel/qguiapplication.cpp | 11 | ||||
-rw-r--r-- | src/gui/kernel/qguiapplication.h | 3 | ||||
-rw-r--r-- | src/widgets/kernel/qapplication.cpp | 14 | ||||
-rw-r--r-- | tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp | 50 |
4 files changed, 58 insertions, 20 deletions
diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp index 1d71c6d075..8e50cbc469 100644 --- a/src/gui/kernel/qguiapplication.cpp +++ b/src/gui/kernel/qguiapplication.cpp @@ -1900,6 +1900,11 @@ bool QGuiApplication::event(QEvent *e) if (topLevelWindow->flags() != Qt::Desktop) postEvent(topLevelWindow, new QEvent(QEvent::LanguageChange)); } + } else if (e->type() == QEvent::ApplicationFontChange) { + for (auto *topLevelWindow : QGuiApplication::topLevelWindows()) { + if (topLevelWindow->flags() != Qt::Desktop) + postEvent(topLevelWindow, new QEvent(QEvent::ApplicationFontChange)); + } } else if (e->type() == QEvent::Quit) { // Close open windows. This is done in order to deliver de-expose // events while the event loop is still running. @@ -3408,8 +3413,10 @@ void QGuiApplicationPrivate::applyWindowGeometrySpecificationTo(QWindow *window) /*! \since 5.11 \fn void QGuiApplication::fontChanged(const QFont &font) + \obsolete - This signal is emitted when the \a font of the application changes. + This signal is emitted when the \a font of the application changes. Use + QEvent::ApplicationFontChanged instead. \sa font() */ @@ -3450,6 +3457,8 @@ void QGuiApplication::setFont(const QFont &font) auto font = *QGuiApplicationPrivate::app_font; locker.unlock(); emit qGuiApp->fontChanged(font); + QEvent event(QEvent::ApplicationFontChange); + QGuiApplication::sendEvent(qGuiApp, &event); } } diff --git a/src/gui/kernel/qguiapplication.h b/src/gui/kernel/qguiapplication.h index fc74c5299a..0c642d8ff5 100644 --- a/src/gui/kernel/qguiapplication.h +++ b/src/gui/kernel/qguiapplication.h @@ -190,8 +190,9 @@ Q_SIGNALS: #endif void paletteChanged(const QPalette &pal); void applicationDisplayNameChanged(); +#if QT_DEPRECATED_SINCE(6, 0) void fontChanged(const QFont &font); - +#endif protected: bool event(QEvent *) override; bool compressEvent(QEvent *, QObject *receiver, QPostEventList *) override; diff --git a/src/widgets/kernel/qapplication.cpp b/src/widgets/kernel/qapplication.cpp index 27af52e199..d0d2ab22ce 100644 --- a/src/widgets/kernel/qapplication.cpp +++ b/src/widgets/kernel/qapplication.cpp @@ -1356,26 +1356,20 @@ QFont QApplication::font(const char *className) void QApplication::setFont(const QFont &font, const char *className) { - bool all = false; FontHash *hash = app_fonts(); if (!className) { QGuiApplication::setFont(font); - if (hash && hash->size()) { - all = true; + if (hash && hash->size()) hash->clear(); - } } else if (hash) { hash->insert(className, font); } if (QApplicationPrivate::is_app_running && !QApplicationPrivate::is_app_closing) { - // Send ApplicationFontChange to qApp itself, and to the widgets. QEvent e(QEvent::ApplicationFontChange); - QCoreApplication::sendEvent(QApplication::instance(), &e); - QWidgetList wids = QApplication::allWidgets(); for (QWidgetList::ConstIterator it = wids.constBegin(), cend = wids.constEnd(); it != cend; ++it) { QWidget *w = *it; - if (all || (!className && w->isWindow()) || w->inherits(className)) // matching class + if (!w->isWindow() && w->inherits(className)) // matching class sendEvent(w, &e); } @@ -1740,14 +1734,14 @@ bool QApplication::event(QEvent *e) #endif } - if(e->type() == QEvent::LanguageChange) { + if (e->type() == QEvent::LanguageChange || e->type() == QEvent::ApplicationFontChange) { // QGuiApplication::event does not account for the cases where // there is a top level widget without a window handle. So they // need to have the event posted here const QWidgetList list = topLevelWidgets(); for (auto *w : list) { if (!w->windowHandle() && (w->windowType() != Qt::Desktop)) - postEvent(w, new QEvent(QEvent::LanguageChange)); + postEvent(w, new QEvent(e->type())); } } diff --git a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp index 833111644e..2e0d293399 100644 --- a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp +++ b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp @@ -417,6 +417,7 @@ private slots: void winIdAfterClose(); void receivesLanguageChangeEvent(); + void receivesApplicationFontChangeEvent(); private: bool ensureScreenSize(int width, int height); @@ -11626,30 +11627,36 @@ void tst_QWidget::winIdAfterClose() delete spy; } -class LanguageChangeEventWidget : public QWidget +class ChangeEventWidget : public QWidget { public: - LanguageChangeEventWidget(QWidget *parent = nullptr) : QWidget(parent) {} + ChangeEventWidget(QWidget *parent = nullptr) : QWidget(parent) {} int languageChangeCount = 0; + int applicationFontChangeCount = 0; protected: bool event(QEvent *e) override { if (e->type() == QEvent::LanguageChange) languageChangeCount++; + else if (e->type() == QEvent::ApplicationFontChange) + applicationFontChangeCount++; return QWidget::event(e); } }; -class LanguageChangeEventWindow : public QWindow +class ChangeEventWindow : public QWindow { public: - LanguageChangeEventWindow(QWindow *parent = nullptr) : QWindow(parent) {} + ChangeEventWindow(QWindow *parent = nullptr) : QWindow(parent) {} int languageChangeCount = 0; + int applicationFontChangeCount = 0; protected: bool event(QEvent *e) override { if (e->type() == QEvent::LanguageChange) languageChangeCount++; + else if (e->type() == QEvent::ApplicationFontChange) + applicationFontChangeCount++; return QWindow::event(e); } }; @@ -11658,14 +11665,14 @@ void tst_QWidget::receivesLanguageChangeEvent() { // Confirm that any QWindow or QWidget only gets a single // LanguageChange event when a translator is installed - LanguageChangeEventWidget topLevel; - auto childWidget = new LanguageChangeEventWidget(&topLevel); + ChangeEventWidget topLevel; + auto childWidget = new ChangeEventWidget(&topLevel); topLevel.show(); QVERIFY(QTest::qWaitForWindowExposed(&topLevel)); - LanguageChangeEventWindow ww; + ChangeEventWindow ww; ww.show(); QVERIFY(QTest::qWaitForWindowExposed(&ww)); - LanguageChangeEventWidget topLevelNotShown; + ChangeEventWidget topLevelNotShown; QTranslator t; QVERIFY(t.load("hellotr_la.qm", ":/")); QVERIFY(qApp->installTranslator(&t)); @@ -11676,5 +11683,32 @@ void tst_QWidget::receivesLanguageChangeEvent() QCOMPARE(ww.languageChangeCount, 1); } +void tst_QWidget::receivesApplicationFontChangeEvent() +{ + // Confirm that any QWindow or top level QWidget only gets a single + // ApplicationFontChange event when the font is changed + const QFont origFont = QApplication::font(); + + ChangeEventWidget topLevel; + auto childWidget = new ChangeEventWidget(&topLevel); + topLevel.show(); + QVERIFY(QTest::qWaitForWindowExposed(&topLevel)); + ChangeEventWindow ww; + ww.show(); + QVERIFY(QTest::qWaitForWindowExposed(&ww)); + ChangeEventWidget topLevelNotShown; + QFont changedFont = origFont; + changedFont.setPointSize(changedFont.pointSize() + 2); + QApplication::setFont(changedFont); + QCoreApplication::sendPostedEvents(0, QEvent::ApplicationFontChange); + QCOMPARE(topLevel.applicationFontChangeCount, 1); + QCOMPARE(topLevelNotShown.applicationFontChangeCount, 1); + // QWidget should not be passing the event on automatically + QCOMPARE(childWidget->applicationFontChangeCount, 0); + QCOMPARE(ww.applicationFontChangeCount, 1); + + QApplication::setFont(origFont); +} + QTEST_MAIN(tst_QWidget) #include "tst_qwidget.moc" |