From e0c00bce35ea1c4fe3aca9945870321e5934ea64 Mon Sep 17 00:00:00 2001 From: Yuhang Zhao <2546789017@qq.com> Date: Mon, 10 Jan 2022 10:07:26 +0800 Subject: [PATCH] Example improvements Try to fix the frame border issue on high dpi monitors. Signed-off-by: Yuhang Zhao <2546789017@qq.com> --- examples/mainwindow/mainwindow.cpp | 31 +++++++++++++++++--------- examples/mainwindow/mainwindow.h | 3 +++ examples/quick/qml/main.qml | 2 +- examples/widget/widget.cpp | 35 ++++++++++++++++++++---------- examples/widget/widget.h | 1 + 5 files changed, 50 insertions(+), 22 deletions(-) diff --git a/examples/mainwindow/mainwindow.cpp b/examples/mainwindow/mainwindow.cpp index 141af82..424ab26 100644 --- a/examples/mainwindow/mainwindow.cpp +++ b/examples/mainwindow/mainwindow.cpp @@ -92,7 +92,8 @@ void MainWindow::showEvent(QShowEvent *event) FramelessWindowsManager::setHitTestVisible(win, titleBarWidget->maximizeButton, true); FramelessWindowsManager::setHitTestVisible(win, titleBarWidget->closeButton, true); FramelessWindowsManager::setHitTestVisible(win, appMainWindow->menubar, true); - setContentsMargins(1, 1, 1, 1); + const auto margin = static_cast(qRound(frameBorderThickness())); + setContentsMargins(margin, margin, margin, margin); inited = true; } } @@ -106,7 +107,8 @@ void MainWindow::changeEvent(QEvent *event) if (isMaximized() || isFullScreen()) { setContentsMargins(0, 0, 0, 0); } else if (!isMinimized()) { - setContentsMargins(1, 1, 1, 1); + const auto margin = static_cast(qRound(frameBorderThickness())); + setContentsMargins(margin, margin, margin, margin); } shouldUpdate = true; Q_EMIT windowStateChanged(); @@ -118,21 +120,31 @@ void MainWindow::changeEvent(QEvent *event) } } +qreal MainWindow::frameBorderThickness() const +{ + return (static_cast(Utilities::getWindowVisibleFrameBorderThickness(winId())) / devicePixelRatioF()); +} + void MainWindow::paintEvent(QPaintEvent *event) { QMainWindow::paintEvent(event); - if ((windowState() == Qt::WindowNoState) && !Utilities::isWin11OrGreater()) { - const int w = width(); - const int h = height(); + if ((windowState() == Qt::WindowNoState) +#ifdef Q_OS_WINDOWS + && !Utilities::isWin11OrGreater() +#endif + ) { + const qreal borderThickness = frameBorderThickness(); + const auto w = static_cast(width()); + const auto h = static_cast(height()); #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) - using BorderLines = QList; + using BorderLines = QList; #else - using BorderLines = QVector; + using BorderLines = QVector; #endif const BorderLines lines = { {0, 0, w, 0}, - {w - 1, 0, w - 1, h}, - {w, h - 1, 0, h - 1}, + {w - borderThickness, 0, w - borderThickness, h}, + {w, h - borderThickness, 0, h - borderThickness}, {0, h, 0, 0} }; QPainter painter(this); @@ -142,7 +154,6 @@ void MainWindow::paintEvent(QPaintEvent *event) const bool colorizedBorder = ((area == ColorizationArea::TitleBar_WindowBorder) || (area == ColorizationArea::All)); const QColor borderColor = (isActiveWindow() ? (colorizedBorder ? Utilities::getColorizationColor() : Qt::black) : Qt::darkGray); - const auto borderThickness = static_cast(Utilities::getWindowVisibleFrameBorderThickness(winId())); painter.setPen({borderColor, borderThickness}); painter.drawLines(lines); painter.restore(); diff --git a/examples/mainwindow/mainwindow.h b/examples/mainwindow/mainwindow.h index 3da1d9b..4f952fe 100644 --- a/examples/mainwindow/mainwindow.h +++ b/examples/mainwindow/mainwindow.h @@ -41,6 +41,9 @@ protected: void paintEvent(QPaintEvent *event) override; void changeEvent(QEvent *event) override; +private: + qreal frameBorderThickness() const; + Q_SIGNALS: void windowStateChanged(); diff --git a/examples/quick/qml/main.qml b/examples/quick/qml/main.qml index 0cc77cc..1cd5d87 100644 --- a/examples/quick/qml/main.qml +++ b/examples/quick/qml/main.qml @@ -35,7 +35,7 @@ Window { title: qsTr("Hello, World!") color: "#f0f0f0" - property real _flh_margin: ((window.visibility === Window.Maximized) || (window.visibility === Window.FullScreen)) ? 0 : Utils.frameBorderThickness + property real _flh_margin: ((window.visibility === Window.Maximized) || (window.visibility === Window.FullScreen)) ? 0 : (Utils.frameBorderThickness / Screen.devicePixelRatio) property var _win_prev_state: null FramelessHelper { diff --git a/examples/widget/widget.cpp b/examples/widget/widget.cpp index a6d0809..4f37797 100644 --- a/examples/widget/widget.cpp +++ b/examples/widget/widget.cpp @@ -102,7 +102,7 @@ void Widget::showEvent(QShowEvent *event) FramelessWindowsManager::setHitTestVisible(win, m_minimizeButton, true); FramelessWindowsManager::setHitTestVisible(win, m_maximizeButton, true); FramelessWindowsManager::setHitTestVisible(win, m_closeButton, true); - const int margin = Utilities::getWindowVisibleFrameBorderThickness(winId()); + const auto margin = static_cast(qRound(frameBorderThickness())); setContentsMargins(margin, margin, margin, margin); } } @@ -120,8 +120,12 @@ void Widget::changeEvent(QEvent *event) QWidget::changeEvent(event); bool shouldUpdate = false; if (event->type() == QEvent::WindowStateChange) { - const int margin = ((isMaximized() || isFullScreen()) ? 0 : Utilities::getWindowVisibleFrameBorderThickness(winId())); - setContentsMargins(margin, margin, margin, margin); + if (isMaximized() || isFullScreen()) { + setContentsMargins(0, 0, 0, 0); + } else if (!isMinimized()) { + const auto margin = static_cast(qRound(frameBorderThickness())); + setContentsMargins(margin, margin, margin, margin); + } updateSystemButtonIcons(); updateTitleBarSize(); shouldUpdate = true; @@ -136,25 +140,29 @@ void Widget::changeEvent(QEvent *event) void Widget::paintEvent(QPaintEvent *event) { QWidget::paintEvent(event); - if ((windowState() == Qt::WindowNoState) && !Utilities::isWin11OrGreater()) { - const int w = width(); - const int h = height(); + if ((windowState() == Qt::WindowNoState) +#ifdef Q_OS_WINDOWS + && !Utilities::isWin11OrGreater() +#endif + ) { + const qreal borderThickness = frameBorderThickness(); + const auto w = static_cast(width()); + const auto h = static_cast(height()); #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) - using BorderLines = QList; + using BorderLines = QList; #else - using BorderLines = QVector; + using BorderLines = QVector; #endif const BorderLines lines = { {0, 0, w, 0}, - {w - 1, 0, w - 1, h}, - {w, h - 1, 0, h - 1}, + {w - borderThickness, 0, w - borderThickness, h}, + {w, h - borderThickness, 0, h - borderThickness}, {0, h, 0, 0} }; const ColorizationArea area = Utilities::getColorizationArea(); const bool colorizedBorder = ((area == ColorizationArea::TitleBar_WindowBorder) || (area == ColorizationArea::All)); const QColor borderColor = (isActiveWindow() ? (colorizedBorder ? Utilities::getColorizationColor() : Qt::black) : Qt::darkGray); - const auto borderThickness = static_cast(Utilities::getWindowVisibleFrameBorderThickness(winId())); QPainter painter(this); painter.save(); painter.setRenderHint(QPainter::Antialiasing, false); @@ -306,6 +314,11 @@ void Widget::updateSystemButtonIcons() m_closeButton->setIcon(QIcon(QStringLiteral(":/images/button_close_%1.svg").arg(suffix))); } +qreal Widget::frameBorderThickness() const +{ + return (static_cast(Utilities::getWindowVisibleFrameBorderThickness(winId())) / devicePixelRatioF()); +} + #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) bool Widget::nativeEvent(const QByteArray &eventType, void *message, qintptr *result) #else diff --git a/examples/widget/widget.h b/examples/widget/widget.h index 071c9cc..8aa921b 100644 --- a/examples/widget/widget.h +++ b/examples/widget/widget.h @@ -55,6 +55,7 @@ private: void updateStyleSheet(); void updateTitleBarSize(); void updateSystemButtonIcons(); + qreal frameBorderThickness() const; private: QWidget *m_titleBarWidget = nullptr;