summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gui/kernel/qguiapplication.cpp11
-rw-r--r--src/gui/kernel/qguiapplication.h3
-rw-r--r--src/widgets/kernel/qapplication.cpp14
-rw-r--r--tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp50
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"