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

QT无边框窗口

1. 创建无边框窗口

通过设置窗口标志来去掉边框。

#include <QtWidgets/QMainWindow>
#include <QtWidgets/QWidget>
#include <QtCore/Qt>class MainWindow : public QMainWindow {
public:MainWindow() {// 去掉边框setWindowFlags(Qt::FramelessWindowHint);// 设置窗口大小resize(800, 600);}
};

2. 创建自定义标题栏

创建一个继承自 QWidget 的类,包含按钮和标题。

#include <QtWidgets/QWidget>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QHBoxLayout>
#include <QtWidgets/QLabel>
#include <QtCore/Qt>class CustomTitleBar : public QWidget {
public:CustomTitleBar(QWidget* parent = nullptr) : QWidget(parent) {setupUI();}private:void setupUI() {QHBoxLayout* layout = new QHBoxLayout(this);layout->setContentsMargins(0, 0, 0, 0);// 标题QLabel* title = new QLabel(parent()->windowTitle());layout->addWidget(title);// 按钮QPushButton* minBtn = new QPushButton("最小化");QPushButton* maxBtn = new QPushButton("最大化");QPushButton* closeBtn = new QPushButton("关闭");layout->addWidget(minBtn);layout->addWidget(maxBtn);layout->addWidget(closeBtn);// 信号连接connect(minBtn, &QPushButton::clicked, parent(), &QWidget::showMinimized);connect(maxBtn, &QPushButton::clicked, parent(), &QWidget::showMaximized);connect(closeBtn, &QPushButton::clicked, parent(), &QWidget::close);}
};

3. 处理窗口移动

重写鼠标事件,实现拖动窗口。

#include <QtWidgets/QMainWindow>
#include <QtCore/QPoint>
#include <QtCore/QMouseEvent>class MainWindow : public QMainWindow {
public:MainWindow() {setWindowFlags(Qt::FramelessWindowHint);resize(800, 600);// 添加自定义标题栏CustomTitleBar* titleBar = new CustomTitleBar(this);setMenuWidget(titleBar); // 将标题栏设置为菜单栏}protected:bool dragging = false;QPoint dragPos;void mousePressEvent(QMouseEvent* event) override {if (event->button() == Qt::LeftButton) {dragging = true;dragPos = event->globalPos() - pos();event->accept();}}void mouseMoveEvent(QMouseEvent* event) override {if (dragging) {move(event->globalPos() - dragPos);event->accept();}}void mouseReleaseEvent(QMouseEvent* event) override {if (event->button() == Qt::LeftButton) {dragging = false;}}
};

4. 处理窗口调整大小

重写调整大小事件,确保标题栏正确显示。

#include <QtWidgets/QMainWindow>
#include <QtWidgets/QWidget>
#include <QtCore/QEvent>class MainWindow : public QMainWindow {
public:MainWindow() {setWindowFlags(Qt::FramelessWindowHint);resize(800, 600);CustomTitleBar* titleBar = new CustomTitleBar(this);setMenuWidget(titleBar);}protected:void resizeEvent(QResizeEvent* event) override {QMainWindow::resizeEvent(event);// 确保标题栏的大小与窗口一致if (menuWidget()) {menuWidget()->setGeometry(QRect(0, 0, width(), menuWidget()->height()));}}
};

5. 复用标题栏

将标题栏类作为独立组件,多个窗口可复用。

#include <QtWidgets/QMainWindow>
#include <QtWidgets/QWidget>
#include <QtCore/Qt>class AnotherWindow : public QMainWindow {
public:AnotherWindow() {setWindowFlags(Qt::FramelessWindowHint);resize(400, 300);CustomTitleBar* titleBar = new CustomTitleBar(this);setMenuWidget(titleBar);}protected:bool dragging = false;QPoint dragPos;void mousePressEvent(QMouseEvent* event) override {if (event->button() == Qt::LeftButton) {dragging = true;dragPos = event->globalPos() - pos();event->accept();}}void mouseMoveEvent(QMouseEvent* event) override {if (dragging) {move(event->globalPos() - dragPos);event->accept();}}void mouseReleaseEvent(QMouseEvent* event) override {if (event->button() == Qt::LeftButton) {dragging = false;}}void resizeEvent(QResizeEvent* event) override {QMainWindow::resizeEvent(event);if (menuWidget()) {menuWidget()->setGeometry(QRect(0, 0, width(), menuWidget()->height()));}}
};

6. 完整示例代码

#include <QtWidgets/QApplication>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QWidget>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QHBoxLayout>
#include <QtWidgets/QLabel>
#include <QtCore/Qt>
#include <QtCore/QPoint>
#include <QtCore/QMouseEvent>
#include <QtCore/QResizeEvent>// 自定义标题栏类
class CustomTitleBar : public QWidget {
public:CustomTitleBar(QWidget* parent = nullptr) : QWidget(parent) {setupUI();}private:void setupUI() {QHBoxLayout* layout = new QHBoxLayout(this);layout->setContentsMargins(0, 0, 0, 0);QLabel* title = new QLabel(parent()->windowTitle());layout->addWidget(title);QPushButton* minBtn = new QPushButton("最小化");QPushButton* maxBtn = new QPushButton("最大化");QPushButton* closeBtn = new QPushButton("关闭");layout->addWidget(minBtn);layout->addWidget(maxBtn);layout->addWidget(closeBtn);connect(minBtn, &QPushButton::clicked, parent(), &QWidget::showMinimized);connect(maxBtn, &QPushButton::clicked, parent(), &QWidget::showMaximized);connect(closeBtn, &QPushButton::clicked, parent(), &QWidget::close);}
};// 主窗口类
class MainWindow : public QMainWindow {
public:MainWindow() {setWindowFlags(Qt::FramelessWindowHint);resize(800, 600);CustomTitleBar* titleBar = new CustomTitleBar(this);setMenuWidget(titleBar);}protected:bool dragging = false;QPoint dragPos;void mousePressEvent(QMouseEvent* event) override {if (event->button() == Qt::LeftButton) {dragging = true;dragPos = event->globalPos() - pos();event->accept();}}void mouseMoveEvent(QMouseEvent* event) override {if (dragging) {move(event->globalPos() - dragPos);event->accept();}}void mouseReleaseEvent(QMouseEvent* event) override {if (event->button() == Qt::LeftButton) {dragging = false;}}void resizeEvent(QResizeEvent* event) override {QMainWindow::resizeEvent(event);if (menuWidget()) {menuWidget()->setGeometry(QRect(0, 0, width(), menuWidget()->height()));}}
};// 另一个窗口类
class AnotherWindow : public QMainWindow {
public:AnotherWindow() {setWindowFlags(Qt::FramelessWindowHint);resize(400, 300);CustomTitleBar* titleBar = new CustomTitleBar(this);setMenuWidget(titleBar);}protected:bool dragging = false;QPoint dragPos;void mousePressEvent(QMouseEvent* event) override {if (event->button() == Qt::LeftButton) {dragging = true;dragPos = event->globalPos() - pos();event->accept();}}void mouseMoveEvent(QMouseEvent* event) override {if (dragging) {move(event->globalPos() - dragPos);event->accept();}}void mouseReleaseEvent(QMouseEvent* event) override {if (event->button() == Qt::LeftButton) {dragging = false;}}void resizeEvent(QResizeEvent* event) override {QMainWindow::resizeEvent(event);if (menuWidget()) {menuWidget()->setGeometry(QRect(0, 0, width(), menuWidget()->height()));}}
};int main(int argc, char* argv[]) {QApplication app(argc, argv);MainWindow mainWindow;AnotherWindow anotherWindow;mainWindow.show();anotherWindow.show();return app.exec();
}

7. 功能说明

无边框窗口:通过 setWindowFlags(Qt::FramelessWindowHint) 实现。

  • 自定义标题栏:创建 CustomTitleBar 类,包含标题和按钮。
  • 窗口移动:重写鼠标事件 (mousePressEvent, mouseMoveEvent, mouseReleaseEvent) 实现拖动窗口。
  • 窗口调整大小:重写 resizeEvent,确保标题栏正确显示。
  • 复用标题栏:CustomTitleBar 作为独立组件,多个窗口可复用。
http://www.lryc.cn/news/594029.html

相关文章:

  • 学习C++、QT---30(QT库中如何自定义控件(自定义按钮)讲解)
  • 在vue中遇到Uncaught TypeError: Assignment to constant variable(常亮无法修改)
  • Ajax简单介绍及Axios请求方式的别名
  • 最简单的 Android TV 项目示例
  • Request和Response相关介绍
  • SparseTSF:用 1000 个参数进行长序列预测建模
  • 分享如何在Window系统的云服务器上部署网站及域名解析+SSL
  • [数据库]Neo4j图数据库搭建快速入门
  • 理解操作系统
  • Leetcode 06 java
  • 深入理解设计模式:访问者模式详解
  • VSCode中Cline无法正确读取终端的问题解决
  • 详解Mysql Order by排序底层原理
  • 金融大前端中的 AI 应用:智能投资顾问与风险评估
  • Facebook 开源多季节性时间序列数据预测工具:Prophet 快速入门 Quick Start
  • Centos卷挂载失败系统无法启动
  • 【Java项目安全基石】登录认证实战:Session/Token/JWT用户校验机制深度解析
  • Android系统5层架构
  • 手推OpenGL相机的正交投影矩阵和透视投影矩阵(附源码)
  • Java 大视界 -- Java 大数据在智能安防门禁系统中的权限动态管理与安全审计(353)
  • LeetCode第337题_打家劫舍III
  • 如何实战优化SEO关键词提升百度排名?
  • SQL Server(2022)安装教程及使用_sqlserver下载安装图文
  • python的pywebview库结合Flask和waitress开发桌面应用程序简介
  • Flink2.0学习笔记:Table API SQL
  • 基于单片机的智能家居安防系统设计
  • GaussDB 数据库架构师修炼(七) 安全规划
  • 【k8s集群管理平台】k8s运维管理的新玩法,让运维电脑随时不离身的现状成为过去
  • 基于机器视觉的迈克耳孙干涉环自动计数系统设计与实现
  • 后台管理系统登录模块(双token的实现思路)