From 18d883b96afabcbd3f60bb8d4d69835ea5334cee Mon Sep 17 00:00:00 2001 From: Yuhang Zhao <2546789017@qq.com> Date: Fri, 26 Mar 2021 17:35:33 +0800 Subject: [PATCH] Minor tweaks Amends commit 0759f7f0106622779994ec87b68bb900eb5ff7d7 Signed-off-by: Yuhang Zhao <2546789017@qq.com> --- CMakeLists.txt | 2 + examples/CMakeLists.txt | 3 +- examples/examples.pro | 2 +- examples/mainwindow/CMakeLists.txt | 47 +++++++++++++ .../{qmainwindow => mainwindow}/MainWindow.ui | 0 .../{qmainwindow => mainwindow}/TitleBar.ui | 0 examples/{qmainwindow => mainwindow}/main.cpp | 67 ++++++------------- .../mainwindow.pro} | 2 +- lib.pro | 10 +-- qtacrylicmainwindow.cpp | 20 +++--- qtacrylicmainwindow.h | 14 ++-- qtacrylicwidget.h | 1 - 12 files changed, 101 insertions(+), 67 deletions(-) create mode 100644 examples/mainwindow/CMakeLists.txt rename examples/{qmainwindow => mainwindow}/MainWindow.ui (100%) rename examples/{qmainwindow => mainwindow}/TitleBar.ui (100%) rename examples/{qmainwindow => mainwindow}/main.cpp (66%) rename examples/{qmainwindow/qmainwindow.pro => mainwindow/mainwindow.pro} (84%) diff --git a/CMakeLists.txt b/CMakeLists.txt index af8a7bb..9af54af 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -56,6 +56,8 @@ if(TARGET Qt${QT_VERSION_MAJOR}::Widgets) list(APPEND SOURCES qtacrylicwidget.h qtacrylicwidget.cpp + qtacrylicmainwindow.h + qtacrylicmainwindow.cpp ) endif() diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index fb489ee..72f5e57 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,6 +1,7 @@ if(TARGET Qt${QT_VERSION_MAJOR}::Widgets) add_subdirectory(widget) + add_subdirectory(mainwindow) endif() if(TARGET Qt${QT_VERSION_MAJOR}::Quick) add_subdirectory(quick) -endif() \ No newline at end of file +endif() diff --git a/examples/examples.pro b/examples/examples.pro index 79e9525..80f181a 100644 --- a/examples/examples.pro +++ b/examples/examples.pro @@ -1,4 +1,4 @@ TEMPLATE = subdirs CONFIG -= ordered -qtHaveModule(widgets): SUBDIRS += widget qmainwindow +qtHaveModule(widgets): SUBDIRS += widget mainwindow qtHaveModule(quick): SUBDIRS += quick diff --git a/examples/mainwindow/CMakeLists.txt b/examples/mainwindow/CMakeLists.txt new file mode 100644 index 0000000..fd9bdf2 --- /dev/null +++ b/examples/mainwindow/CMakeLists.txt @@ -0,0 +1,47 @@ +set(CMAKE_INCLUDE_CURRENT_DIR ON) + +set(CMAKE_AUTOUIC ON) +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) + +find_package(QT NAMES Qt6 Qt5 COMPONENTS Widgets REQUIRED) +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Widgets REQUIRED) + +set(SOURCES + ../images.qrc + TitleBar.ui + MainWindow.ui + main.cpp +) + +if(WIN32) + enable_language(RC) + list(APPEND SOURCES ../windows.rc ../windows.manifest) +endif() + +add_executable(MainWindow WIN32 ${SOURCES}) + +target_link_libraries(MainWindow PRIVATE + Qt${QT_VERSION_MAJOR}::Widgets + wangwenx190::FramelessHelper +) + +target_compile_definitions(MainWindow PRIVATE + QT_NO_CAST_FROM_ASCII + QT_NO_CAST_TO_ASCII + QT_NO_KEYWORDS + QT_DEPRECATED_WARNINGS + QT_DISABLE_DEPRECATED_BEFORE=0x060000 +) + +if(MSVC) + target_compile_options(MainWindow PRIVATE /utf-8) + if(NOT (CMAKE_BUILD_TYPE STREQUAL "Debug")) + target_compile_options(MainWindow PRIVATE /guard:cf) + target_link_options(MainWindow PRIVATE /GUARD:CF) + endif() +endif() + +if(WIN32) + target_link_libraries(MainWindow PRIVATE user32 shell32 gdi32 dwmapi) +endif() diff --git a/examples/qmainwindow/MainWindow.ui b/examples/mainwindow/MainWindow.ui similarity index 100% rename from examples/qmainwindow/MainWindow.ui rename to examples/mainwindow/MainWindow.ui diff --git a/examples/qmainwindow/TitleBar.ui b/examples/mainwindow/TitleBar.ui similarity index 100% rename from examples/qmainwindow/TitleBar.ui rename to examples/mainwindow/TitleBar.ui diff --git a/examples/qmainwindow/main.cpp b/examples/mainwindow/main.cpp similarity index 66% rename from examples/qmainwindow/main.cpp rename to examples/mainwindow/main.cpp index 761c57c..e88e838 100644 --- a/examples/qmainwindow/main.cpp +++ b/examples/mainwindow/main.cpp @@ -26,13 +26,10 @@ #include "../../qtacrylicmainwindow.h" #include "ui_MainWindow.h" #include "ui_TitleBar.h" -#include -#include -#include -#include -#ifdef WIN32 -#include -#endif +#include +#include +#include +#include int main(int argc, char *argv[]) { @@ -59,7 +56,7 @@ int main(int argc, char *argv[]) QApplication application(argc, argv); - QtAcrylicMainWindow *mainWindow = new QtAcrylicMainWindow(NULL, Qt::WindowFlags()); + QtAcrylicMainWindow *mainWindow = new QtAcrylicMainWindow; mainWindow->setAcrylicEnabled(true); Ui::MainWindow appMainWindow; @@ -74,31 +71,22 @@ int main(int argc, char *argv[]) mainWindow->setMenuWidget(widget); - QObject::connect(mainWindow, - &QMainWindow::windowIconChanged, - titleBarWidget.iconButton, - &QPushButton::setIcon); - QObject::connect(mainWindow, - &QMainWindow::windowTitleChanged, - titleBarWidget.titleLabel, - &QLabel::setText); - QObject::connect(titleBarWidget.closeButton, - &QPushButton::clicked, - mainWindow, - &QMainWindow::close); - QObject::connect(titleBarWidget.minimizeButton, - &QPushButton::clicked, - mainWindow, - &QMainWindow::showMinimized); - QObject::connect(titleBarWidget.maximizeButton, - &QPushButton::clicked, - [mainWindow, titleBarWidget]() { - if (mainWindow->isMaximized()) { - mainWindow->showNormal(); - } else { - mainWindow->showMaximized(); - } - }); + QObject::connect(mainWindow, &QMainWindow::windowIconChanged, titleBarWidget.iconButton, &QPushButton::setIcon); + QObject::connect(mainWindow, &QMainWindow::windowTitleChanged, titleBarWidget.titleLabel, &QLabel::setText); + QObject::connect(titleBarWidget.closeButton, &QPushButton::clicked, mainWindow, &QMainWindow::close); + QObject::connect(titleBarWidget.minimizeButton, &QPushButton::clicked, mainWindow, &QMainWindow::showMinimized); + QObject::connect(titleBarWidget.maximizeButton, &QPushButton::clicked, [mainWindow](){ + if (mainWindow->isMaximized() || mainWindow->isFullScreen()) { + mainWindow->showNormal(); + } else { + mainWindow->showMaximized(); + } + }); + QObject::connect(mainWindow, &QtAcrylicMainWindow::windowStateChanged, [mainWindow, titleBarWidget](){ + titleBarWidget.maximizeButton->setChecked(mainWindow->isMaximized()); + titleBarWidget.maximizeButton->setToolTip(mainWindow->isMaximized() ? QObject::tr("Restore") : QObject::tr("Maximize")); + }); + QObject::connect(titleBarWidget.iconButton, &QPushButton::clicked, mainWindow, &QtAcrylicMainWindow::displaySystemMenu); QStyleOption option; option.initFrom(mainWindow); @@ -108,19 +96,8 @@ int main(int argc, char *argv[]) mainWindow->createWinId(); // Qt's internal function, make sure it's a top level window. const QWindow *win = mainWindow->windowHandle(); - - QObject::connect(mainWindow, - &QtAcrylicMainWindow::windowStateChanged, - [mainWindow, titleBarWidget]() { - titleBarWidget.maximizeButton->setChecked(mainWindow->isMaximized()); - titleBarWidget.maximizeButton->setToolTip(mainWindow->isMaximized() ? QObject::tr("Restore") : QObject::tr("Maximize")); - }); - - QObject::connect(titleBarWidget.iconButton, - &QPushButton::clicked, - mainWindow, - &QtAcrylicMainWindow::displaySystemMenu); + FramelessWindowsManager::addWindow(win); FramelessWindowsManager::addIgnoreObject(win, titleBarWidget.iconButton); FramelessWindowsManager::addIgnoreObject(win, titleBarWidget.minimizeButton); FramelessWindowsManager::addIgnoreObject(win, titleBarWidget.maximizeButton); diff --git a/examples/qmainwindow/qmainwindow.pro b/examples/mainwindow/mainwindow.pro similarity index 84% rename from examples/qmainwindow/qmainwindow.pro rename to examples/mainwindow/mainwindow.pro index 777e72d..b71f743 100644 --- a/examples/qmainwindow/qmainwindow.pro +++ b/examples/mainwindow/mainwindow.pro @@ -1,4 +1,4 @@ -TARGET = QMainWindow +TARGET = MainWindow TEMPLATE = app QT += widgets SOURCES += main.cpp diff --git a/lib.pro b/lib.pro index d3a17d7..c0bd4b5 100644 --- a/lib.pro +++ b/lib.pro @@ -24,10 +24,12 @@ SOURCES += \ qtacryliceffecthelper.cpp qtHaveModule(widgets) { QT += widgets - HEADERS += qtacrylicwidget.h \ - qtacrylicmainwindow.h - SOURCES += qtacrylicwidget.cpp \ - qtacrylicmainwindow.cpp + HEADERS += \ + qtacrylicwidget.h \ + qtacrylicmainwindow.h + SOURCES += \ + qtacrylicwidget.cpp \ + qtacrylicmainwindow.cpp } qtHaveModule(quick) { QT += quick diff --git a/qtacrylicmainwindow.cpp b/qtacrylicmainwindow.cpp index 58a1b17..6386fd2 100644 --- a/qtacrylicmainwindow.cpp +++ b/qtacrylicmainwindow.cpp @@ -24,12 +24,13 @@ #include "qtacrylicmainwindow.h" #include "utilities.h" -#include "framelesswindowsmanager.h" #include #include #include -QtAcrylicMainWindow::QtAcrylicMainWindow(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, flags) {} +QtAcrylicMainWindow::QtAcrylicMainWindow(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, flags) +{ +} QtAcrylicMainWindow::~QtAcrylicMainWindow() = default; @@ -150,6 +151,9 @@ void QtAcrylicMainWindow::setAcrylicEnabled(const bool value) setBackgroundRole(m_acrylicEnabled ? QPalette::Base : QPalette::Window); update(); Q_EMIT acrylicEnabledChanged(); + if (m_acrylicEnabled) { + m_acrylicHelper.showWarning(); + } } } @@ -158,7 +162,6 @@ void QtAcrylicMainWindow::showEvent(QShowEvent *event) QMainWindow::showEvent(event); updateContentMargin(); if (!m_inited) { - FramelessWindowsManager::addWindow(windowHandle()); m_acrylicHelper.install(windowHandle()); m_acrylicHelper.updateAcrylicBrush(tintColor()); connect(&m_acrylicHelper, &QtAcrylicEffectHelper::needsRepaint, this, qOverload<>(&QtAcrylicMainWindow::update)); @@ -168,7 +171,8 @@ void QtAcrylicMainWindow::showEvent(QShowEvent *event) void QtAcrylicMainWindow::updateContentMargin() { - const qreal m = isMaximized() ? 0.0 : 1.0 / devicePixelRatioF(); + const qreal margin = (isMaximized() || isFullScreen()) ? 0.0 : (1.0 / devicePixelRatioF()); + const int m = qRound(margin); setContentsMargins(m, m, m, m); } @@ -187,16 +191,16 @@ void QtAcrylicMainWindow::paintEvent(QPaintEvent *event) void QtAcrylicMainWindow::changeEvent(QEvent *event) { - if( event->type()==QEvent::WindowStateChange ) { + QMainWindow::changeEvent(event); + if (event->type() == QEvent::WindowStateChange) { updateContentMargin(); Q_EMIT windowStateChanged(); } - QMainWindow::changeEvent(event); } void QtAcrylicMainWindow::displaySystemMenu() { -#ifdef WIN32 +#ifdef Q_OS_WINDOWS Utilities::displaySystemMenu(windowHandle()); #endif -} \ No newline at end of file +} diff --git a/qtacrylicmainwindow.h b/qtacrylicmainwindow.h index 744969b..90ad401 100644 --- a/qtacrylicmainwindow.h +++ b/qtacrylicmainwindow.h @@ -41,7 +41,7 @@ class FRAMELESSHELPER_EXPORT QtAcrylicMainWindow : public QMainWindow Q_PROPERTY(bool acrylicEnabled READ acrylicEnabled WRITE setAcrylicEnabled NOTIFY acrylicEnabledChanged) public: - explicit QtAcrylicMainWindow(QWidget *parent = nullptr, Qt::WindowFlags flags = Qt::WindowFlags()); + explicit QtAcrylicMainWindow(QWidget *parent = nullptr, Qt::WindowFlags flags = {}); ~QtAcrylicMainWindow() override; QColor tintColor() const; @@ -61,10 +61,13 @@ public: qreal frameThickness() const; void setFrameThickness(const qreal value); - + bool acrylicEnabled() const; void setAcrylicEnabled(const bool value); +public Q_SLOTS: + void displaySystemMenu(); + Q_SIGNALS: void tintColorChanged(); void tintOpacityChanged(); @@ -75,18 +78,17 @@ Q_SIGNALS: void acrylicEnabledChanged(); void windowStateChanged(); -public Q_SLOTS: - void displaySystemMenu(); - protected: void showEvent(QShowEvent *event) override; void paintEvent(QPaintEvent *event) override; void changeEvent(QEvent *event) override; +private: + void updateContentMargin(); + private: QtAcrylicEffectHelper m_acrylicHelper; bool m_frameVisible = true; bool m_acrylicEnabled = false; bool m_inited = false; - void updateContentMargin(); }; diff --git a/qtacrylicwidget.h b/qtacrylicwidget.h index f9a3271..9849f59 100644 --- a/qtacrylicwidget.h +++ b/qtacrylicwidget.h @@ -73,7 +73,6 @@ Q_SIGNALS: void frameColorChanged(); void frameThicknessChanged(); void acrylicEnabledChanged(); - void windowStateChanged(); protected: void showEvent(QShowEvent *event) override;