QtQuick demo: work-around a QtQuick bug

See https://bugreports.qt.io/browse/QTBUG-69711
Also some minor tweaks of the constexpr variables.

Fixes: #35

Signed-off-by: Yuhang Zhao <2546789017@qq.com>
This commit is contained in:
Yuhang Zhao 2022-02-10 10:13:48 +08:00
parent ebe7da1a9f
commit a9256ba4b3
9 changed files with 39 additions and 20 deletions

View File

@ -79,7 +79,7 @@ Window {
MinimizeButton { MinimizeButton {
id: minimizeButton id: minimizeButton
onClicked: window.showMinimized() onClicked: framelessHelper.showMinimized()
Component.onCompleted: framelessHelper.setHitTestVisible(minimizeButton, true) Component.onCompleted: framelessHelper.setHitTestVisible(minimizeButton, true)
} }

View File

@ -37,7 +37,7 @@ FRAMELESSHELPER_USE_NAMESPACE
static const QColor systemLightColor = QStringLiteral("#f0f0f0"); static const QColor systemLightColor = QStringLiteral("#f0f0f0");
static const QColor systemDarkColor = QColor::fromRgb(32, 32, 32); static const QColor systemDarkColor = QColor::fromRgb(32, 32, 32);
static constexpr char mainStyleSheet[] = R"( static constexpr const char mainStyleSheet[] = R"(
#MainWidget { #MainWidget {
background-color: %1; background-color: %1;
} }

View File

@ -105,12 +105,12 @@ Q_NAMESPACE
namespace Constants namespace Constants
{ {
[[maybe_unused]] constexpr char kFramelessModeFlag[] = "_FRAMELESSHELPER_FRAMELESS_MODE"; [[maybe_unused]] static constexpr const char kFramelessModeFlag[] = "_FRAMELESSHELPER_FRAMELESS_MODE";
[[maybe_unused]] constexpr char kResizeBorderThicknessFlag[] = "_FRAMELESSHELPER_RESIZE_BORDER_THICKNESS"; [[maybe_unused]] static constexpr const char kResizeBorderThicknessFlag[] = "_FRAMELESSHELPER_RESIZE_BORDER_THICKNESS";
[[maybe_unused]] constexpr char kCaptionHeightFlag[] = "_FRAMELESSHELPER_CAPTION_HEIGHT"; [[maybe_unused]] static constexpr const char kCaptionHeightFlag[] = "_FRAMELESSHELPER_CAPTION_HEIGHT";
[[maybe_unused]] constexpr char kTitleBarHeightFlag[] = "_FRAMELESSHELPER_TITLE_BAR_HEIGHT"; [[maybe_unused]] static constexpr const char kTitleBarHeightFlag[] = "_FRAMELESSHELPER_TITLE_BAR_HEIGHT";
[[maybe_unused]] constexpr char kHitTestVisibleFlag[] = "_FRAMELESSHELPER_HIT_TEST_VISIBLE"; [[maybe_unused]] static constexpr const char kHitTestVisibleFlag[] = "_FRAMELESSHELPER_HIT_TEST_VISIBLE";
[[maybe_unused]] constexpr char kWindowFixedSizeFlag[] = "_FRAMELESSHELPER_WINDOW_FIXED_SIZE"; [[maybe_unused]] static constexpr const char kWindowFixedSizeFlag[] = "_FRAMELESSHELPER_WINDOW_FIXED_SIZE";
} }

View File

@ -35,6 +35,9 @@ FRAMELESSHELPER_BEGIN_NAMESPACE
struct FramelessHelperWinData struct FramelessHelperWinData
{ {
explicit FramelessHelperWinData() = default;
~FramelessHelperWinData() = default;
[[nodiscard]] bool create() { [[nodiscard]] bool create() {
if (!m_instance.isNull()) { if (!m_instance.isNull()) {
return false; return false;
@ -85,6 +88,7 @@ struct FramelessHelperWinData
} }
private: private:
Q_DISABLE_COPY_MOVE(FramelessHelperWinData)
QScopedPointer<FramelessHelperWin> m_instance; QScopedPointer<FramelessHelperWin> m_instance;
bool m_installed = false; bool m_installed = false;
}; };

View File

@ -124,13 +124,13 @@ using flh_PTIMECAPS = flh_timecaps_tag *;
using flh_NPTIMECAPS = flh_timecaps_tag * NEAR; using flh_NPTIMECAPS = flh_timecaps_tag * NEAR;
using flh_LPTIMECAPS = flh_timecaps_tag * FAR; using flh_LPTIMECAPS = flh_timecaps_tag * FAR;
[[maybe_unused]] static constexpr UINT kAutoHideTaskbarThickness = 2; // The thickness of an auto-hide taskbar in pixels [[maybe_unused]] static constexpr const UINT kAutoHideTaskbarThickness = 2; // The thickness of an auto-hide taskbar in pixels
[[maybe_unused]] static constexpr char kDwmRegistryKey[] = R"(Software\Microsoft\Windows\DWM)"; [[maybe_unused]] static constexpr const char kDwmRegistryKey[] = R"(Software\Microsoft\Windows\DWM)";
[[maybe_unused]] static constexpr char kPersonalizeRegistryKey[] = R"(Software\Microsoft\Windows\CurrentVersion\Themes\Personalize)"; [[maybe_unused]] static constexpr const char kPersonalizeRegistryKey[] = R"(Software\Microsoft\Windows\CurrentVersion\Themes\Personalize)";
[[maybe_unused]] static constexpr UINT kDefaultResizeBorderThicknessClassic = 4; [[maybe_unused]] static constexpr const UINT kDefaultResizeBorderThicknessClassic = 4;
[[maybe_unused]] static constexpr UINT kDefaultResizeBorderThicknessAero = 8; [[maybe_unused]] static constexpr const UINT kDefaultResizeBorderThicknessAero = 8;
[[maybe_unused]] static constexpr UINT kDefaultCaptionHeight = 23; [[maybe_unused]] static constexpr const UINT kDefaultCaptionHeight = 23;
[[maybe_unused]] static constexpr DWORD _DWMWA_VISIBLE_FRAME_BORDER_THICKNESS = 37; [[maybe_unused]] static constexpr const DWORD _DWMWA_VISIBLE_FRAME_BORDER_THICKNESS = 37;

View File

@ -25,6 +25,9 @@
#include "framelessquickhelper.h" #include "framelessquickhelper.h"
#include "framelesswindowsmanager.h" #include "framelesswindowsmanager.h"
#include <QtQuick/qquickwindow.h> #include <QtQuick/qquickwindow.h>
#ifdef Q_OS_WINDOWS
#include "framelesshelper_windows.h"
#endif
FRAMELESSHELPER_BEGIN_NAMESPACE FRAMELESSHELPER_BEGIN_NAMESPACE
@ -89,4 +92,14 @@ void FramelessQuickHelper::setHitTestVisible(QQuickItem *item, const bool visibl
FramelessWindowsManager::setHitTestVisible(window(), item, visible); FramelessWindowsManager::setHitTestVisible(window(), item, visible);
} }
void FramelessQuickHelper::showMinimized()
{
#ifdef Q_OS_WINDOWS
// Work-around a QtQuick bug: https://bugreports.qt.io/browse/QTBUG-69711
ShowWindow(reinterpret_cast<HWND>(window()->winId()), SW_MINIMIZE);
#else
window()->showMinimized();
#endif
}
FRAMELESSHELPER_END_NAMESPACE FRAMELESSHELPER_END_NAMESPACE

View File

@ -53,11 +53,13 @@ public:
Q_NODISCARD bool resizable() const; Q_NODISCARD bool resizable() const;
void setResizable(const bool val); void setResizable(const bool val);
Q_NODISCARD Q_INVOKABLE bool isWindowFrameless() const;
public Q_SLOTS: public Q_SLOTS:
void removeWindowFrame(); void removeWindowFrame();
void bringBackWindowFrame(); void bringBackWindowFrame();
Q_NODISCARD bool isWindowFrameless() const;
void setHitTestVisible(QQuickItem *item, const bool visible); void setHitTestVisible(QQuickItem *item, const bool visible);
void showMinimized();
Q_SIGNALS: Q_SIGNALS:
void resizeBorderThicknessChanged(qreal); void resizeBorderThicknessChanged(qreal);

View File

@ -28,8 +28,8 @@
FRAMELESSHELPER_BEGIN_NAMESPACE FRAMELESSHELPER_BEGIN_NAMESPACE
static constexpr int kDefaultResizeBorderThickness = 8; static constexpr const int kDefaultResizeBorderThickness = 8;
static constexpr int kDefaultCaptionHeight = 23; static constexpr const int kDefaultCaptionHeight = 23;
int Utilities::getSystemMetric(const QWindow *window, const SystemMetric metric, const bool dpiScale, const bool forceSystemValue) int Utilities::getSystemMetric(const QWindow *window, const SystemMetric metric, const bool dpiScale, const bool forceSystemValue)
{ {

View File

@ -266,7 +266,7 @@ void Utilities::triggerFrameChange(const WId winId)
return; return;
} }
const auto hwnd = reinterpret_cast<HWND>(winId); const auto hwnd = reinterpret_cast<HWND>(winId);
constexpr UINT flags = (SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOOWNERZORDER); static constexpr const UINT flags = (SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOOWNERZORDER);
if (SetWindowPos(hwnd, nullptr, 0, 0, 0, 0, flags) == FALSE) { if (SetWindowPos(hwnd, nullptr, 0, 0, 0, 0, flags) == FALSE) {
qWarning() << getSystemErrorMessage(QStringLiteral("SetWindowPos")); qWarning() << getSystemErrorMessage(QStringLiteral("SetWindowPos"));
} }