当前位置: 首页 > news >正文

使用C++与Qt6,在windows上打造MacOS风格桌面应用窗口

在桌面应用、嵌入式系统等开发领域中,C++与Qt6的组合一直是开发者的优选方案之一。二者结合不仅能发挥C++的性能优势,还能借助Qt6的框架能力大幅度提升开发效率,尤其在跨平台场景下优势显著。

一、准备开发环境

开发工具:Visual Studio 2022

开发环境:Qt6.9

二、创建新项目

1.在Visual Studio中创建新项目,选择Qt Widgets Application

2.输入项目名后点击创建

3.弹出Qt的引导界面,点击下一步,选择开发版本以及所需的库,默认的Qt Core,QtGui,QtWidgets即可完成项目创建

三、设计用户界面

MacOS桌面应用窗口的显著特征是整体窗口为圆角,顶部标签栏为毛玻璃且窗口名在标签栏中心位置,关闭、最小化、缩放按钮则在标签栏的最左侧,且为红黄绿三种颜色。

四、编写代码

创建两个文件:macwindow.cpp,macwindow.h

macwindow.h

#pragma once
#include <QMainWindow>
#include <QWidget>
#include <QGraphicsEffect>class MacWindow : public QMainWindow
{Q_OBJECT
public:explicit MacWindow(QWidget *parent = nullptr);protected:void paintEvent(QPaintEvent *event) override;void mousePressEvent(QMouseEvent *event) override;void mouseMoveEvent(QMouseEvent *event) override;private:QPoint m_dragPosition;
};

macwindow.cpp

#include "stdafx.h"
#include "macwindow.h"
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QPushButton>
#include <QPainter>
#include <QLabel>MacWindow::MacWindow(QWidget *parent) : QMainWindow(parent),m_dragPosition(0, 0) 
{setWindowFlags(Qt::FramelessWindowHint);setAttribute(Qt::WA_TranslucentBackground);setFixedSize(800, 600);QWidget *mainWidget = new QWidget(this);mainWidget->setObjectName("mainWidget");mainWidget->setStyleSheet("QWidget#mainWidget{background:white;border-radius:6px;}");QVBoxLayout *mainLayout = new QVBoxLayout(mainWidget);mainLayout->setContentsMargins(0, 0, 0, 0);mainLayout->setSpacing(0);QWidget *titleBar = new QWidget(mainWidget);titleBar->setFixedHeight(30);titleBar->setStyleSheet("background:#f0f0f0;border-top-left-radius:6px;border-top-right-radius:6px;");QHBoxLayout *titleLayout = new QHBoxLayout(titleBar);titleLayout->setContentsMargins(12, 0, 12, 0);titleLayout->setSpacing(8);QWidget *btnGroup = new QWidget(titleBar);QHBoxLayout *btnLayout = new QHBoxLayout(btnGroup);btnLayout->setSpacing(8);btnLayout->setContentsMargins(0, 0, 0, 0);QPushButton *closeBtn = new QPushButton(btnGroup);closeBtn->setFixedSize(12, 12);closeBtn->setStyleSheet("background:#ff5f56;border-radius:6px;border:none;");connect(closeBtn, &QPushButton::clicked, this, &QMainWindow::close);QPushButton *minimizeBtn = new QPushButton(btnGroup);minimizeBtn->setFixedSize(12, 12);minimizeBtn->setStyleSheet("background:#ffbd2e;border-radius:6px;border:none;");connect(minimizeBtn, &QPushButton::clicked, this, &QMainWindow::showMinimized);QPushButton *maximizeBtn = new QPushButton(btnGroup);maximizeBtn->setFixedSize(12, 12);maximizeBtn->setStyleSheet("background:#27c93f;border-radius:6px;border:none;");connect(maximizeBtn, &QPushButton::clicked, this, [this](){ isMaximized() ? showNormal() : showMaximized(); });btnLayout->addWidget(closeBtn);btnLayout->addWidget(minimizeBtn);btnLayout->addWidget(maximizeBtn);QLabel *titleLabel = new QLabel("1", titleBar);titleLabel->setAlignment(Qt::AlignCenter);titleLabel->setStyleSheet("color:#555555;font:12px 'Microsoft YaHei';");QWidget *spacer = new QWidget(titleBar);spacer->setFixedSize(btnGroup->sizeHint());titleLayout->addWidget(btnGroup);titleLayout->addWidget(titleLabel, 1);titleLayout->addWidget(spacer);QWidget *contentWidget = new QWidget(mainWidget);contentWidget->setStyleSheet("background:white;border-bottom-left-radius:6px;border-bottom-right-radius:6px;");mainLayout->addWidget(titleBar);mainLayout->addWidget(contentWidget, 1);setCentralWidget(mainWidget);
}void MacWindow::paintEvent(QPaintEvent *event) {Q_UNUSED(event);QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);painter.setPen(Qt::NoPen);painter.setBrush(QColor(240, 240, 240));painter.drawRoundedRect(rect(), 6, 6);
}void MacWindow::mousePressEvent(QMouseEvent *event) {if (event->button() == Qt::LeftButton) {m_dragPosition = event->globalPosition().toPoint() - this->frameGeometry().topLeft();event->accept();}
}void MacWindow::mouseMoveEvent(QMouseEvent *event) {if (event->buttons() & Qt::LeftButton) {move(event->globalPosition().toPoint() - m_dragPosition);event->accept();}
}

main.cpp

#include "stdafx.h"
#include "macwindow.h"
#include <QApplication>int main(int argc, char* argv[]) {QApplication app(argc, argv);MacWindow window;window.setWindowTitle("1");window.show();return app.exec();
}

stdafx.h

#pragma once
#pragma execution_character_set("utf-8")
#pragma warning(disable : 4828)#include <QtWidgets/QMainWindow>
#include <QtGui/QPainter>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QLabel>
#include <QtGui/QMouseEvent>
#include <QtWidgets/QHBoxLayout>

五、项目源码地址

链接:https://pan.baidu.com/s/1DX7CtIM55nG_uIj_5iXBzA?pwd=ud41

http://www.xdnf.cn/news/1368613.html

相关文章:

  • SELinux
  • Mac测试端口连接的几种方式
  • 【制作100个Unity游戏】从零开始构建类《月圆之夜》《杀戮尖塔》的卡牌游戏(附带项目源码)
  • CSS 结构伪类选择器
  • C语言开发入门教程:从环境搭建到第一个程序
  • 【lucene】SpanNotQuery 存在的意义
  • 国产化Excel开发组件Spire.XLS教程:Python 读取 CSV 文件,从基础到进阶指南
  • 一文看懂@Bean注解的原理
  • 【C++】用哈希表封装实现unordered_set和unordered_map
  • Ubuntu 操作系统
  • 自动化测试概念与 Web 自动化实战(基于 Selenium)
  • Tensor常见操作
  • pycharm 远程连接服务器报错
  • Java基础第二课:hello word
  • 160.在 Vue3 中用 OpenLayers 解决国内 OpenStreetMap 地图加载不出来的问题
  • 从行业智能体到一站式开发平台,移动云推动AI智能体规模化落地
  • Windows 命令行:mkdir 命令
  • 三菱FX5U PLC访问字变量的某一位
  • Elasticsearch精准匹配与全文检索对比
  • 如何从零开始学习黑客技术?网络安全入门指南
  • 读《精益数据分析》:用户行为热力图
  • 【算法--链表题2】19.删除链表的倒数第 N 个节点:通俗详解
  • 腾讯开源OpenTenBase深度实践:企业级分布式HTAP数据库部署全攻略
  • Qt数据结构与编码技巧全解析
  • Spring - 文件上传与下载:真正的企业开发高频需求——Spring Boot文件上传与下载全场景实践指南
  • 基于stm32的物联网OneNet火灾报警系统
  • 支持向量机(SVM)内容概述
  • Hive高阶函数之行转列JSON数据解析
  • uniapp 引入使用u-view 完整步骤,u-view 样式不生效
  • 要闻集锦|阿里官网调整为四大业务板块;华为云重组多个事业部涉及上千人;群核科技在港交所更新招股书