From 6d0653f94ddf33da4ee5ff4ff28310a6205479d3 Mon Sep 17 00:00:00 2001 From: Zhao Yuhang <2546789017@qq.com> Date: ćšć, 28 12æ 2023 20:10:08 +0800 Subject: [PATCH] update qmsetup --- src/widgets/widgetwindowagent_mac.cpp | 29 +++++++++++++++++++++++------ 1 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/widgets/widgetwindowagent_mac.cpp b/src/widgets/widgetwindowagent_mac.cpp index d09f7b3..97b6028 100644 --- a/src/widgets/widgetwindowagent_mac.cpp +++ b/src/widgets/widgetwindowagent_mac.cpp @@ -4,6 +4,10 @@ namespace QWK { + static inline QRect getWidgetSceneRect(QWidget *widget) { + return {widget->mapTo(widget->window(), QPoint()), widget->size()}; + } + class SystemButtonAreaWidgetEventFilter : public QObject { public: SystemButtonAreaWidgetEventFilter(QWidget *widget, AbstractWindowContext *ctx, @@ -15,17 +19,18 @@ protected: bool eventFilter(QObject *obj, QEvent *event) override { + Q_UNUSED(obj) switch (event->type()) { case QEvent::Move: case QEvent::Resize: { - ctx->setSystemButtonArea(widget->geometry()); + ctx->setSystemButtonArea(getWidgetSceneRect(widget)); break; } default: break; } - return QObject::eventFilter(obj, event); + return false; } protected: @@ -33,21 +38,33 @@ AbstractWindowContext *ctx; }; + /*! + Returns the widget that acts as the system button area. + */ QWidget *WidgetWindowAgent::systemButtonArea() const { Q_D(const WidgetWindowAgent); return d->systemButtonAreaWidget; } + /*! + Sets the widget that acts as the system button area. The system button will be centered in + its area, it is recommended to place the widget in a layout and set a fixed size policy. + */ void WidgetWindowAgent::setSystemButtonArea(QWidget *widget) { Q_D(WidgetWindowAgent); + if (d->systemButtonAreaWidget == widget) + return; + + auto ctx = d->context.get(); d->systemButtonAreaWidget = widget; if (!widget) { - systemButtonAreaWidgetEventFilter.reset(); - d->context->setSystemButtonArea({}); + d->systemButtonAreaWidgetEventFilter.reset(); + ctx->setSystemButtonArea({}); return; } - systemButtonAreaWidgetEventFilter = - std::make_unique<SystemButtonAreaWidgetEventFilter>(widget, d->context); + d->systemButtonAreaWidgetEventFilter = + std::make_unique<SystemButtonAreaWidgetEventFilter>(widget, ctx); + ctx->setSystemButtonArea(getWidgetSceneRect(widget)); } } \ No newline at end of file -- Gitblit v1.9.1