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

【QT】实现无边框窗口+可拖动+可调整大小

QT无边框

// 在widget构造中添加如下即可实现无边框
setWindowFlags(Qt::FramelessWindowHint);  //设置无边框

可拖动

当实现无边框之后,你会发现无法拖动了。
或许我们需要了解下窗口是怎么被拖动的

  1. 通过标题栏拖动窗口
  2. move窗口位置
    因此有两种方案可以解决无法拖动
// 1. 通过定位到标题栏拖动窗口
// 重写nativeEvent事件,是QT用于处理原生系统事件
bool Widget::nativeEvent(const QByteArray& eventType, void* message, long* result)
{MSG* msg = (MSG*)message;switch (msg->message){case WM_NCHITTEST:int xPos = GET_X_LPARAM(msg->lParam) - this->frameGeometry().x();int yPos = GET_Y_LPARAM(msg->lParam) - this->frameGeometry().y();if (xPos && xPos < width() && yPos && yPos < height())*result = HTCAPTION;elsereturn false;return true;}return false;
}

PS:
GET_X_LPARAM(msg->lParam)获取鼠标在屏幕中坐标,原点为屏幕左上角
this->frameGeometry().x()获取窗口左上角x坐标
通过计算,可将鼠标坐标系换算成窗口坐标系中
HTCAPTION是一个常量,表示鼠标在窗口的标题栏上
此种处理有缺陷,会导致无法点击窗口中控件

// 2. move窗口位置
// 通过重写mousePressEvent、mouseMoveEvent事件
protected:void mousePressEvent(QMouseEvent* event);void mouseMoveEvent(QMouseEvent* event);
private:QPoint m_dragPosition;  // 用于窗口移动的临时变量void Widget::mousePressEvent(QMouseEvent* event)
{// 当鼠标左键按下时记录鼠标的全局坐标与窗口左上角的坐标差if (event->button() == Qt::LeftButton) {m_dragPosition = event->pos();event->accept();}
}void Widget::mouseMoveEvent(QMouseEvent* event)
{// 当鼠标左键被按下时移动窗口if (event->buttons() & Qt::LeftButton) {move(event->globalPos() - m_dragPosition);event->accept();}
}

PS:
pos()获取鼠标在窗口坐标系中位置
globalPos()获取鼠标在屏幕坐标系中位置
原理:
通过鼠标移动中,计算窗口左上角位置,实现移动

可调整大小

同上,重写nativeEvent即可

bool Widget::nativeEvent(const QByteArray& eventType, void* message, long* result)
{MSG* msg = (MSG*)message;switch (msg->message){case WM_NCHITTEST:int xPos = GET_X_LPARAM(msg->lParam) - this->frameGeometry().x();int yPos = GET_Y_LPARAM(msg->lParam) - this->frameGeometry().y();if (xPos && xPos < width() && yPos && yPos < height())*result = HTCAPTION;else if (xPos < boundaryWidth && yPos < boundaryWidth)                    //左上角*result = HTTOPLEFT;else if (xPos >= width() - boundaryWidth && yPos < boundaryWidth)          //右上角*result = HTTOPRIGHT;else if (xPos < boundaryWidth && yPos >= height() - boundaryWidth)         //左下角*result = HTBOTTOMLEFT;else if (xPos >= width() - boundaryWidth && yPos >= height() - boundaryWidth)//右下角*result = HTBOTTOMRIGHT;else if (xPos < boundaryWidth)                                     //左边*result = HTLEFT;else if (xPos >= width() - boundaryWidth)                              //右边*result = HTRIGHT;else if (yPos < boundaryWidth)                                       //上边*result = HTTOP;else if (yPos >= height() - boundaryWidth)                             //下边*result = HTBOTTOM;elsereturn false;}return false;
}

参考文章

  1. QT实现完美无边框窗口(可拖动,可调整大小)
  2. Qt无边框窗口实现拖动和改变大小(修改)
  3. Qt::FramelessWindowHint无边框化,移动,大小调整

相关文章:

  • TCP与UDP_三次握手_四次挥手
  • 最新解决docker镜像无法下载问题
  • Redis的哨兵模式是?功能?(通俗易懂版)
  • 用 PID 优化拥塞控制
  • 存储无界限:MK米客方德SD NAND系列,小容量到大容量的全方位覆盖
  • 天软特色因子看板(2024.06 第8期)
  • 展讯-QMI8658和气压传感器驱动调试
  • Maven和JAVA_HOME的关系
  • 【ajax核心04】利用async、await解决显式promise链问题
  • Java中的大数据处理与分析架构
  • 头歌——机器学习——支持向量机案例
  • 解决Windows下移动硬盘无法弹出的问题:\$Extend\$RmMetadata\$TxfLog\$TxfLog.blf
  • 红队内网攻防渗透:内网渗透之内网对抗:横向移动篇Kerberos委派安全非约束系约束系RBCD资源系Spooler利用
  • 由 Vault 支持的 KES 的 MinIO Operator
  • 【INTEL(ALTERA)】Nios® II EDS 是否在 Windows 10 上受支持?
  • Angular 响应式表单 基础例子
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • webpack入门学习手记(二)
  • 闭包--闭包之tab栏切换(四)
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 解析 Webpack中import、require、按需加载的执行过程
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 前端路由实现-history
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 微服务框架lagom
  • 想使用 MongoDB ,你应该了解这8个方面!
  • MyCAT水平分库
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (八)Spring源码解析:Spring MVC
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (二)丶RabbitMQ的六大核心
  • (分布式缓存)Redis持久化
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转)C#调用WebService 基础
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .net 微服务 服务保护 自动重试 Polly
  • .NET 药厂业务系统 CPU爆高分析
  • .NET 直连SAP HANA数据库
  • .NET成年了,然后呢?
  • /usr/bin/perl:bad interpreter:No such file or directory 的解决办法
  • @Import注解详解
  • [20171113]修改表结构删除列相关问题4.txt
  • [240607] Jina AI 发布多模态嵌入模型 | PHP 曝新漏洞 | TypeScript 5.5 RC 发布公告