From 469c975a708ed86c834b59ed751a4548c693a7b9 Mon Sep 17 00:00:00 2001 From: 李威 wei.li <108964761+liwey1985@users.noreply.github.com> Date: 周一, 21 4月 2025 15:34:54 +0800 Subject: [PATCH] Fix NSWindowProxy::setSystemButtonVisible not taking effect (#175) --- examples/mainwindow/mainwindow.cpp | 100 +++++++++++++++++++++++++++++++------------------ 1 files changed, 63 insertions(+), 37 deletions(-) diff --git a/examples/mainwindow/mainwindow.cpp b/examples/mainwindow/mainwindow.cpp index bf2c4b0..fb3d5eb 100644 --- a/examples/mainwindow/mainwindow.cpp +++ b/examples/mainwindow/mainwindow.cpp @@ -37,11 +37,14 @@ protected: void timerEvent(QTimerEvent *event) override { + QLabel::timerEvent(event); setText(QTime::currentTime().toString(QStringLiteral("hh:mm:ss"))); } }; MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { + setAttribute(Qt::WA_DontCreateNativeAncestors); + installWindowAgent(); #if 1 @@ -128,14 +131,6 @@ return QMainWindow::event(event); } - -void MainWindow::closeEvent(QCloseEvent *event) { - // if (!(qApp->keyboardModifiers() & Qt::ControlModifier)) { - // QTimer::singleShot(1000, this, &QWidget::show); - // } - event->accept(); -} - void MainWindow::installWindowAgent() { // 1. Setup window agent windowAgent = new QWK::WidgetWindowAgent(this); @@ -143,7 +138,7 @@ // 2. Construct your title bar auto menuBar = [this]() { - auto menuBar = new QMenuBar(); + auto menuBar = new QMenuBar(this); // Virtual menu auto file = new QMenu(tr("File(&F)"), menuBar); @@ -166,46 +161,60 @@ }); #ifdef Q_OS_WIN + auto noneAction = new QAction(tr("None"), menuBar); + noneAction->setData(QStringLiteral("none")); + noneAction->setCheckable(true); + noneAction->setChecked(true); + auto dwmBlurAction = new QAction(tr("Enable DWM blur"), menuBar); + dwmBlurAction->setData(QStringLiteral("dwm-blur")); dwmBlurAction->setCheckable(true); - connect(dwmBlurAction, &QAction::toggled, this, [this](bool checked) { - if (!windowAgent->setWindowAttribute(QStringLiteral("dwm-blur"), checked)) { - return; - } - setProperty("custom-style", checked); - style()->polish(this); - }); auto acrylicAction = new QAction(tr("Enable acrylic material"), menuBar); + acrylicAction->setData(QStringLiteral("acrylic-material")); acrylicAction->setCheckable(true); - connect(acrylicAction, &QAction::toggled, this, [this](bool checked) { - if (!windowAgent->setWindowAttribute(QStringLiteral("acrylic-material"), true)) { - return; - } - setProperty("custom-style", checked); - style()->polish(this); - }); auto micaAction = new QAction(tr("Enable mica"), menuBar); + micaAction->setData(QStringLiteral("mica")); micaAction->setCheckable(true); - connect(micaAction, &QAction::toggled, this, [this](bool checked) { - if (!windowAgent->setWindowAttribute(QStringLiteral("mica"), checked)) { - return; - } - setProperty("custom-style", checked); - style()->polish(this); - }); auto micaAltAction = new QAction(tr("Enable mica alt"), menuBar); + micaAltAction->setData(QStringLiteral("mica-alt")); micaAltAction->setCheckable(true); - connect(micaAltAction, &QAction::toggled, this, [this](bool checked) { - if (!windowAgent->setWindowAttribute(QStringLiteral("mica-alt"), checked)) { - return; - } - setProperty("custom-style", checked); - style()->polish(this); - }); + + auto winStyleGroup = new QActionGroup(menuBar); + winStyleGroup->addAction(noneAction); + winStyleGroup->addAction(dwmBlurAction); + winStyleGroup->addAction(acrylicAction); + winStyleGroup->addAction(micaAction); + winStyleGroup->addAction(micaAltAction); + connect(winStyleGroup, &QActionGroup::triggered, this, + [this, winStyleGroup](QAction *action) { + // Unset all custom style attributes first, otherwise the style will not display + // correctly + for (const QAction *_act : winStyleGroup->actions()) { + const QString data = _act->data().toString(); + if (data.isEmpty() || data == QStringLiteral("none")) { + continue; + } + windowAgent->setWindowAttribute(data, false); + } + const QString data = action->data().toString(); + if (data == QStringLiteral("none")) { + setProperty("custom-style", false); + } else if (!data.isEmpty()) { + windowAgent->setWindowAttribute(data, true); + setProperty("custom-style", true); + } + style()->polish(this); + }); + #elif defined(Q_OS_MAC) + // Set whether to use system buttons (close/minimize/zoom) + // - true: Hide system buttons (use custom UI controls) + // - false: Show native system buttons (default behavior) + windowAgent->setWindowAttribute(QStringLiteral("no-system-buttons"), false); + auto darkBlurAction = new QAction(tr("Dark blur"), menuBar); darkBlurAction->setCheckable(true); connect(darkBlurAction, &QAction::toggled, this, [this](bool checked) { @@ -254,6 +263,7 @@ #ifdef Q_OS_WIN settings->addSeparator(); + settings->addAction(noneAction); settings->addAction(dwmBlurAction); settings->addAction(acrylicAction); settings->addAction(micaAction); @@ -280,6 +290,12 @@ iconButton->setObjectName(QStringLiteral("icon-button")); iconButton->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); + auto pinButton = new QWK::WindowButton(); + pinButton->setCheckable(true); + pinButton->setObjectName(QStringLiteral("pin-button")); + pinButton->setProperty("system-button", true); + pinButton->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); + auto minButton = new QWK::WindowButton(); minButton->setObjectName(QStringLiteral("min-button")); minButton->setProperty("system-button", true); @@ -300,6 +316,7 @@ auto windowBar = new QWK::WindowBar(); #ifndef Q_OS_MAC windowBar->setIconButton(iconButton); + windowBar->setPinButton(pinButton); windowBar->setMinButton(minButton); windowBar->setMaxButton(maxButton); windowBar->setCloseButton(closeButton); @@ -310,6 +327,7 @@ windowAgent->setTitleBar(windowBar); #ifndef Q_OS_MAC + windowAgent->setHitTestVisible(pinButton, true); windowAgent->setSystemButton(QWK::WindowAgentBase::WindowIcon, iconButton); windowAgent->setSystemButton(QWK::WindowAgentBase::Minimize, minButton); windowAgent->setSystemButton(QWK::WindowAgentBase::Maximize, maxButton); @@ -328,6 +346,14 @@ #ifndef Q_OS_MAC + connect(windowBar, &QWK::WindowBar::pinRequested, this, [this, pinButton](bool pin){ + if (isHidden() || isMinimized() || isMaximized() || isFullScreen()) { + return; + } + setWindowFlag(Qt::WindowStaysOnTopHint, pin); + show(); + pinButton->setChecked(pin); + }); connect(windowBar, &QWK::WindowBar::minimizeRequested, this, &QWidget::showMinimized); connect(windowBar, &QWK::WindowBar::maximizeRequested, this, [this, maxButton](bool max) { if (max) { -- Gitblit v1.9.1