Qt无边框设计

news/2025/1/12 8:41:56/
//指定窗口为无边框
this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowMinMaxButtonsHint);

重写鼠标事件:

void mousePressEvent(QMouseEvent* event) override;
void mouseMoveEvent(QMouseEvent* event) override;

定义位置:

QPoint diff_pos;//鼠标和窗口的相对位移QPoint window_pos;//绝对位置QPoint mouse_pos;
void QtWidgetsApplication2::mousePressEvent(QMouseEvent * event)
{mouse_pos = event->globalPos();window_pos = this->pos();diff_pos = mouse_pos - window_pos;}void QtWidgetsApplication2::mouseMoveEvent(QMouseEvent * event)
{QPoint pos = event->globalPos();this->move(pos - diff_pos);
}

再创建一个widget作为标题栏,并定义好控件:

#include <QWidget>
#include <QLabel>
#include <QPushButton>class CTitleBar : public QWidget
{Q_OBJECTpublic:CTitleBar(QWidget *parent = nullptr);~CTitleBar();private:void init();private:QLabel* logo;QLabel* title;QPushButton* set;QPushButton* min;QPushButton* max;QPushButton* close;
};

初始化控件:

void CTitleBar::initUI()
{logo = new QLabel(this);title = new QLabel(this);title->setText(u8"标题");title->setFixedWidth(120);set = new QPushButton(this);set->setFixedSize(32, 32);min = new QPushButton(this);min->setFixedSize(32, 32);max = new QPushButton(this);max->setFixedSize(32, 32);close = new QPushButton(this);close->setFixedSize(32, 32);QHBoxLayout* lay = new QHBoxLayout(this);lay->addWidget(logo);lay->addWidget(title);lay->addWidget(set);lay->addWidget(min);lay->addWidget(max);lay->addWidget(close);lay->setContentsMargins(5, 5, 5,5);
}

实现无边窗口的拉伸、改变大小:

重写nativeEvent:

#include <qt_windows.h>
bool nativeEvent(const QByteArray& eventType, void* message, long* result) override;bool QtWidgetsApplication2::nativeEvent(const QByteArray & eventType, void * message, long * result)
{MSG* param = static_cast<MSG*>(message);switch (param->message){case WM_NCHITTEST:{int nX = GET_X_LPARAM(param->lParam) - this->geometry().x();int nY = GET_Y_LPARAM(param->lParam) - this->geometry().y();/*if (childAt(nX, nY) != nullptr)return QWidget::nativeEvent(eventType, message, result);*/if (nX > m_nBorderWidth && nX < this->width() - m_nBorderWidth &&nY > m_nBorderWidth && nY < this->height() - m_nBorderWidth){if (childAt(nX, nY) != nullptr)return QWidget::nativeEvent(eventType, message, result);}if ((nX > 0) && (nX < m_nBorderWidth))*result = HTLEFT;if ((nX > this->width() - m_nBorderWidth) && (nX < this->width()))*result = HTRIGHT;if ((nY > 0) && (nY < m_nBorderWidth))*result = HTTOP;if ((nY > this->height() - m_nBorderWidth) && (nY < this->height()))*result = HTBOTTOM;if ((nX > 0) && (nX < m_nBorderWidth) && (nY > 0)&& (nY < m_nBorderWidth))*result = HTTOPLEFT;if ((nX > this->width() - m_nBorderWidth) && (nX < this->width())&& (nY > 0) && (nY < m_nBorderWidth))*result = HTTOPRIGHT;if ((nX > 0) && (nX < m_nBorderWidth)&& (nY > this->height() - m_nBorderWidth) && (nY < this->height()))*result = HTBOTTOMLEFT;if ((nX > this->width() - m_nBorderWidth) && (nX < this->width())&& (nY > this->height() - m_nBorderWidth) && (nY < this->height()))*result = HTBOTTOMRIGHT;return true;}}return false;
}

启用鼠标悬停事件:

setAttribute(Qt::WA_Hover)


http://www.ppmy.cn/news/1246811.html

相关文章

Linux网络编程 SQLite库(TCP Socket 服务器 客户端)

聊天室系统 SQLite库 服务器 客户端 聊天室系统 当设计一个聊天室系统时&#xff0c;会涉及到许多方面的知识。简单的项目结构&#xff0c;从不同的方面对聊天室的设计进行分析。请注意&#xff0c;以下的结构只是一个示例&#xff0c;实际项目可能会更加复杂&#xff0c;具体…

完美解决:vue.js:6 TypeError: Cannot read properties of undefined (reading ‘0‘)

Vue项目出现以下报错&#xff1a; 原因&#xff1a; 在渲染的时候&#xff0c;不满足某个条件而报错&#xff0c;或者某个属性丢失或后台没传过来导致 我这里出现的原因是后台给我传递过来的数组中&#xff0c;其中有一条少传了一个我在渲染时需要用的属性&#xff0c;没让后台…

2015年五一杯数学建模A题不确定性条件下的最优路径问题解题全过程文档及程序

2015年五一杯数学建模 A题 不确定性条件下的最优路径问题 原题再现 目前&#xff0c;交通拥挤和事故正越来越严重的困扰着城市交通。随着我国交通运输事业的迅速发展&#xff0c;交通“拥塞”已经成为很多城市的“痼疾”。在复杂的交通环境下&#xff0c;如何寻找一条可靠、快…

【浅尝C++】C++类的6大默认成员函数——构造、析构及拷贝构造函数

&#x1f388;归属专栏&#xff1a;浅尝C &#x1f697;个人主页&#xff1a;Jammingpro &#x1f41f;记录一句&#xff1a;好想摆烂&#xff0c;又好想学习~~ 文章前言&#xff1a;本篇文章简要介绍C类的构造函数、析构函数及拷贝构造函数&#xff0c;介绍每个小点时&#xf…

Java 设计模式——建造者模式

目录 1.概述2.结构3.实例3.1.产品类3.2.抽象建造者类3.3.具体建造者类3.4.指挥者类3.5.测试 4.优缺点5.使用场景6.模式扩展7.创建者模式对比 1.概述 建造者模式 (Builder Pattern) 是一种创建型设计模式&#xff0c;用于创建复杂对象。它将对象的构建过程分离成独立的部分&…

Java学习路线第一篇:Java基础(1)

Java学习路线图&#xff0c;还不赶紧快来查收~ 这篇则分享Java学习路线第一part&#xff1a;Java基础&#xff08;1&#xff09; 从看到这篇内容开始&#xff0c;你就是被选定的天命骚年&#xff0c;将承担起学完Java基础的使命&#xff0c;本使命为单向契约&#xff0c;你可…

C语言每日一题(39)寻找两个正序数组的中位数

力扣网 4 寻找两个正序数组的中位数 题目描述 给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,…

经济观察与ChatGPT聊了聊 :OpeoAI 的144个小时到底发生了什么

本心、输入输出、结果 文章目录 经济观察与ChatGPT聊了聊 &#xff1a;OpeoAI 的144个小时到底发生了什么前言感恩节&#xff1a;奥特曼在社交媒体上发文&#xff1a;和Quora CEO亚当德安杰洛&#xff08;Adam DAngelo&#xff09;度过了美好的几个小时对话ChatGPT 探寻技术发展…