| | |
| | | installWindowAgent(); |
| | | |
| | | auto clockWidget = new ClockWidget(); |
| | | clockWidget->setObjectName("clock-widget"); |
| | | clockWidget->setObjectName(QStringLiteral("clock-widget")); |
| | | clockWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); |
| | | setCentralWidget(clockWidget); |
| | | |
| | | if (QFile qss(":/dark-style.qss"); qss.open(QIODevice::ReadOnly | QIODevice::Text)) { |
| | | if (QFile qss(QStringLiteral(":/dark-style.qss")); |
| | | qss.open(QIODevice::ReadOnly | QIODevice::Text)) { |
| | | setStyleSheet(QString::fromUtf8(qss.readAll())); |
| | | } |
| | | |
| | | setWindowTitle("Example MainWindow"); |
| | | resize(640, 480); |
| | | setWindowTitle(tr("Example MainWindow")); |
| | | resize(800, 600); |
| | | } |
| | | |
| | | static inline void emulateLeaveEvent(QWidget *widget) { |
| | |
| | | }); |
| | | } |
| | | |
| | | MainWindow::~MainWindow() { |
| | | } |
| | | MainWindow::~MainWindow() = default; |
| | | |
| | | bool MainWindow::event(QEvent *event) { |
| | | switch (event->type()) { |
| | |
| | | } |
| | | |
| | | void MainWindow::installWindowAgent() { |
| | | // 1. Setup window agent |
| | | auto agent = new QWK::WidgetWindowAgent(this); |
| | | if (!agent->setup(this)) { |
| | | qFatal("Frameless handle failed to initialize."); |
| | | qFatal("QWK failed to initialize."); |
| | | } |
| | | |
| | | // 2. Construct your title bar |
| | | auto menuBar = []() { |
| | | auto menuBar = new QMenuBar(); |
| | | auto file = new QMenu("File(&F)", menuBar); |
| | | file->addAction(new QAction("New(&N)", menuBar)); |
| | | file->addAction(new QAction("Open(&O)", menuBar)); |
| | | auto file = new QMenu(tr("File(&F)"), menuBar); |
| | | file->addAction(new QAction(tr("New(&N)"), menuBar)); |
| | | file->addAction(new QAction(tr("Open(&O)"), menuBar)); |
| | | |
| | | auto edit = new QMenu("Edit(&E)", menuBar); |
| | | edit->addAction(new QAction("Undo(&U)", menuBar)); |
| | | edit->addAction(new QAction("Redo(&R)", menuBar)); |
| | | auto edit = new QMenu(tr("Edit(&E)"), menuBar); |
| | | edit->addAction(new QAction(tr("Undo(&U)"), menuBar)); |
| | | edit->addAction(new QAction(tr("Redo(&R)"), menuBar)); |
| | | |
| | | menuBar->addMenu(file); |
| | | menuBar->addMenu(edit); |
| | | return menuBar; |
| | | }(); |
| | | menuBar->setObjectName("win-menu-bar"); |
| | | menuBar->setObjectName(QStringLiteral("win-menu-bar")); |
| | | |
| | | auto titleLabel = new QLabel(); |
| | | titleLabel->setAlignment(Qt::AlignCenter); |
| | | titleLabel->setObjectName("win-title-label"); |
| | | titleLabel->setObjectName(QStringLiteral("win-title-label")); |
| | | |
| | | #ifndef Q_OS_MAC |
| | | auto iconButton = new QWK::WindowButton(); |
| | | iconButton->setObjectName("icon-button"); |
| | | iconButton->setObjectName(QStringLiteral("icon-button")); |
| | | iconButton->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); |
| | | |
| | | auto minButton = new QWK::WindowButton(); |
| | | minButton->setObjectName("min-button"); |
| | | minButton->setObjectName(QStringLiteral("min-button")); |
| | | minButton->setProperty("system-button", true); |
| | | minButton->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); |
| | | |
| | | auto maxButton = new QWK::WindowButton(); |
| | | maxButton->setCheckable(true); |
| | | maxButton->setObjectName("max-button"); |
| | | maxButton->setObjectName(QStringLiteral("max-button")); |
| | | maxButton->setProperty("system-button", true); |
| | | maxButton->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); |
| | | |
| | | auto closeButton = new QWK::WindowButton(); |
| | | closeButton->setObjectName("close-button"); |
| | | closeButton->setObjectName(QStringLiteral("close-button")); |
| | | closeButton->setProperty("system-button", true); |
| | | closeButton->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); |
| | | #endif |
| | | |
| | | auto windowBar = new QWK::WindowBar(); |
| | | #ifndef Q_OS_MAC |
| | | windowBar->setIconButton(iconButton); |
| | | windowBar->setMinButton(minButton); |
| | | windowBar->setMaxButton(maxButton); |
| | | windowBar->setCloseButton(closeButton); |
| | | #endif |
| | | windowBar->setMenuBar(menuBar); |
| | | windowBar->setTitleLabel(titleLabel); |
| | | windowBar->setHostWidget(this); |
| | | |
| | | agent->setTitleBar(windowBar); |
| | | #ifndef Q_OS_MAC |
| | | agent->setSystemButton(QWK::WindowAgentBase::WindowIcon, iconButton); |
| | | agent->setSystemButton(QWK::WindowAgentBase::Minimize, minButton); |
| | | agent->setSystemButton(QWK::WindowAgentBase::Maximize, maxButton); |
| | | agent->setSystemButton(QWK::WindowAgentBase::Close, closeButton); |
| | | #endif |
| | | agent->setHitTestVisible(menuBar, true); |
| | | |
| | | setMenuWidget(windowBar); |
| | | |
| | | // 3. Adds simulated mouse events to the title bar buttons |
| | | #ifdef Q_OS_WINDOWS |
| | | // Emulate Window system menu button behaviors |
| | | connect(iconButton, &QAbstractButton::clicked, this, [iconButton, agent] { |
| | | connect(iconButton, &QAbstractButton::clicked, agent, [iconButton, agent] { |
| | | iconButton->setProperty("double-click-close", false); |
| | | |
| | | // Pick a suitable time threshold |
| | | QTimer::singleShot(75, [iconButton, agent]() { |
| | | QTimer::singleShot(75, agent, [iconButton, agent]() { |
| | | if (iconButton->property("double-click-close").toBool()) |
| | | return; |
| | | agent->showSystemMenu(iconButton->mapToGlobal({0, iconButton->height()})); |
| | | agent->showSystemMenu(iconButton->mapToGlobal(QPoint{0, iconButton->height()})); |
| | | }); |
| | | }); |
| | | connect(iconButton, &QWK::WindowButton::doubleClicked, this, [iconButton, this]() { |
| | |
| | | }); |
| | | #endif |
| | | |
| | | #ifndef Q_OS_MAC |
| | | connect(windowBar, &QWK::WindowBar::minimizeRequested, this, &QWidget::showMinimized); |
| | | connect(windowBar, &QWK::WindowBar::maximizeRequested, this, [this, maxButton](bool max) { |
| | | if (max) { |
| | |
| | | emulateLeaveEvent(maxButton); |
| | | }); |
| | | connect(windowBar, &QWK::WindowBar::closeRequested, this, &QWidget::close); |
| | | setMenuWidget(windowBar); |
| | | #endif |
| | | } |