当前位置: 首页 > 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.dtcms.com/a/351139.html

相关文章:

  • PDF文件中的相邻页面合并成一页,例如将第1页和第2页合并,第3页和第4页合并
  • Mac测试端口连接的几种方式
  • 如何将视频从安卓设备传输到Mac?
  • Mac安装mitmproxy及操作对监控的请求
  • 少儿舞蹈小程序详细设计文档
  • Mac中修改Word的Normal.dotm文件
  • 使用Uniapp开发小程序,如何引入插件组件!
  • 三电平buckboost电路出现上下母线不平衡是什么原因
  • Linux驱动开发笔记(八)——按键输入实验
  • 滚珠导轨如何定义半导体制造精度?
  • 【LeetCode 热题 100】75. 颜色分类——双指针
  • 算法题打卡力扣第209题:长度最小的子数组(mid)
  • 计算神经科学数学建模编程深度前沿方向研究(中)
  • AbMole小课堂丨Lenvatinib(E7080):如何通过靶向多靶点抑制VEGFR/FGFR/PDGFRα抑制肿瘤?
  • 【vue eslint】报错:Component name “xxxx“ should always be multi-word
  • LeetCode 100 -- Day6
  • 论文阅读:CIKM 2024 Empowering Private Tutoring by Chaining Large Language Models
  • 低空经济产业白皮书:音视频链路在智能飞行体系中的核心地位
  • 验证码请求与缓存问题解决方案
  • 用无标签语音自我提升音频大模型:SI-SDA 方法详解
  • 【JavaEE】(19) MyBatis-plus
  • 基于SpringBoot的考研资讯平台
  • 没有cpolar:会议记录手忙脚乱;有了cpolar:CapsWriter语音转文字轻松搞定
  • 如何在GitHub找到10k+个stars的仓库
  • USB摄像头驱动完整分析 (从插入到出画)
  • 飞算JavaAI:Java开发新时代的破晓之光
  • 基于印染数据的可视化系统设计与实现
  • 【笔记】大模型业务场景流程综述
  • (论文速读)MBQ:大型视觉语言模型的模态平衡量化
  • 深度学习在金融订单簿分析与短期市场预测中的应用