From d02f3b0bc32f711bf33a7fd288185963e9e96189 Mon Sep 17 00:00:00 2001
From: Yuhang Zhao <zhaoyuhang@rankyee.com>
Date: 周二, 05 12月 2023 16:21:28 +0800
Subject: [PATCH] add isFixedSize implementation

---
 src/widgets/widgetitemdelegate.cpp       |   17 +++++++++++++++++
 src/core/contexts/win32windowcontext.cpp |    2 +-
 2 files changed, 18 insertions(+), 1 deletions(-)

diff --git a/src/core/contexts/win32windowcontext.cpp b/src/core/contexts/win32windowcontext.cpp
index dcb6eb8..67a278f 100644
--- a/src/core/contexts/win32windowcontext.cpp
+++ b/src/core/contexts/win32windowcontext.cpp
@@ -1143,7 +1143,7 @@
                 QPoint qtScenePos = fromNativeLocalPosition(
                     m_windowHandle, QPoint(nativeLocalPos.x, nativeLocalPos.y));
 
-                bool isFixedSize = /*isWindowFixedSize()*/ false; // ### FIXME
+                bool isFixedSize = m_delegate->isHostSizeFixed(m_host);
                 bool isTitleBar = isInTitleBarDraggableArea(qtScenePos);
                 bool dontOverrideCursor = false;                  // ### TODO
 
diff --git a/src/widgets/widgetitemdelegate.cpp b/src/widgets/widgetitemdelegate.cpp
index 9d338c1..bfa730c 100644
--- a/src/widgets/widgetitemdelegate.cpp
+++ b/src/widgets/widgetitemdelegate.cpp
@@ -36,6 +36,23 @@
     }
 
     bool WidgetItemDelegate::isHostSizeFixed(QObject *host) const {
+        const auto widget = static_cast<QWidget *>(host);
+        // "Qt::MSWindowsFixedSizeDialogHint" is used cross-platform actually.
+        if (widget->windowFlags() & Qt::MSWindowsFixedSizeDialogHint) {
+            return true;
+        }
+        // Caused by setFixedWidth/Height/Size().
+        const QSize minSize = widget->minimumSize();
+        const QSize maxSize = widget->maximumSize();
+        if (!minSize.isEmpty() && !maxSize.isEmpty() && (minSize == maxSize)) {
+            return true;
+        }
+        // Usually set by the user.
+        const QSizePolicy sizePolicy = widget->sizePolicy();
+        if ((sizePolicy.horizontalPolicy() == QSizePolicy::Fixed)
+            && (sizePolicy.verticalPolicy() == QSizePolicy::Fixed)) {
+            return true;
+        }
         return false;
     }
 

--
Gitblit v1.9.1