From 564f33e8b29a6f73050f4da3f843b942aaf0d739 Mon Sep 17 00:00:00 2001 From: Sine Striker <trueful@163.com> Date: 周三, 08 5月 2024 19:36:16 +0800 Subject: [PATCH] Improve event filter handling --- src/widgets/widgetwindowagent_win.cpp | 20 ++++++++++++++++---- 1 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/widgets/widgetwindowagent_win.cpp b/src/widgets/widgetwindowagent_win.cpp index 706e865..d3e8ecd 100644 --- a/src/widgets/widgetwindowagent_win.cpp +++ b/src/widgets/widgetwindowagent_win.cpp @@ -8,6 +8,8 @@ #include <QtCore/QDateTime> #include <QtGui/QPainter> +#include <QtCore/private/qcoreapplication_p.h> + #include <QWKCore/qwindowkit_windows.h> #include <QWKCore/private/qwkglobal_p.h> #include <QWKCore/private/windows10borderhandler_p.h> @@ -62,8 +64,13 @@ } inline void forwardEventToWidgetAndDraw(QWidget *w, QEvent *event) { - // Let the widget paint first - static_cast<QObject *>(w)->event(event); + // https://github.com/qt/qtbase/blob/e26a87f1ecc40bc8c6aa5b889fce67410a57a702/src/widgets/kernel/qapplication.cpp#L3286 + // Deliver the event + if (!forwardObjectEventFilters(ctx, w, event)) { + // Let the widget paint first + std::ignore = static_cast<QObject *>(w)->event(event); + QCoreApplicationPrivate::setEventSpontaneous(event, false); + } // Due to the timer or user action, Qt will repaint some regions spontaneously, // even if there is no WM_PAINT message, we must wait for it to finish painting @@ -72,8 +79,13 @@ } inline void forwardEventToWindowAndDraw(QWindow *window, QEvent *event) { - // Let Qt paint first - static_cast<QObject *>(window)->event(event); + // https://github.com/qt/qtbase/blob/e26a87f1ecc40bc8c6aa5b889fce67410a57a702/src/widgets/kernel/qapplication.cpp#L3286 + // Deliver the event; + if (!forwardObjectEventFilters(ctx, window, event)) { + // Let Qt paint first + std::ignore = static_cast<QObject *>(window)->event(event); + QCoreApplicationPrivate::setEventSpontaneous(event, false); + } // Upon receiving the WM_PAINT message, Qt will repaint the entire view, and we // must wait for it to finish painting before drawing this top border area. -- Gitblit v1.9.1