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

Qt实现无边框窗口的拖动和缩放

 在使用QT创建窗体的时候,为了使窗口美化,通常不使用QT自带的边框。会调用下面函数去除窗体边框。

setWindowFlags(Qt::FramelessWindowHint)

但是有个问题,当去除了QT自带边框后,窗体就变得不能移动了,也不能改变窗口大小了。这确实是个问题,该怎么去解决呢?

 1.重写mousePressEvent\ mouseMoveEvent mouseReleaseEvent事件

protected:
    void mousePressEvent(QMouseEvent* ev)override;
    void mouseReleaseEvent(QMouseEvent* ev)override;
    void mouseMoveEvent(QMouseEvent* ev)override;

.h文件

namespace {/* 这里我们将一个窗口划分为9个区域,分别为左上角(1, 1)、中上(1,2)、右上角(1, 3)左中  (2, 1)、 中间(2, 2)、右中  (2, 3)左下角(3, 1)、中下(3,2)、 右下角(3, 3)*/const int kMouseRegionLeft = 5;const int kMouseRegionTop = 5;const int kMouseRegionRight = 5;const int kMouseRegionBottom = 5;}// 鼠标的 活动范围的 枚举
enum MousePosition{// 这个是上面图片划分的区域 1,1 区 就用 11 代表 , 1,2 就用12 代表 以此类推kMousePositionLeftTop = 11,kMousePositionTop = 12,kMousePositionRightTop = 13,kMousePositionLeft = 21,kMousePositionMid = 22,kMousePositionRight = 23,kMousePositionLeftBottom = 31,kMousePositionBottom = 32,kMousePositionRightBottom = 33,};private://根据鼠标的设置鼠标样式,用于拉伸void SetMouseCursor(int x, int y);//判断鼠标的区域,用于拉伸int GetMouseRegion(int x, int y);
private:bool isPress;QPoint windowsLastPs;QPoint mousePs;int mouse_press_region = kMousePositionMid;

 .cpp文件

void SPlay::mousePressEvent(QMouseEvent* ev)
{if (ev->button() == Qt::LeftButton) {// 如果是鼠标左键// 获取当前窗口位置,以窗口左上角windowsLastPs = pos();// 获取鼠标在屏幕的位置  就是全局的坐标 以屏幕左上角为坐标系mousePs = ev->globalPos();isPress = true;// 获取鼠标在那个区域mouse_press_region = GetMouseRegion(ev->pos().x(), ev->pos().y());}
}void SPlay::mouseReleaseEvent(QMouseEvent* ev)
{if (ev->button() == Qt::LeftButton) {isPress = false;}setCursor(QCursor{});
}void SPlay::mouseMoveEvent(QMouseEvent* ev)
{// 设置鼠标的形状SetMouseCursor(ev->pos().x(), ev->pos().y());// 计算的鼠标移动偏移量, 就是鼠标全局坐标 - 减去点击时鼠标坐标QPoint point_offset = ev->globalPos() - mousePs;if ((ev->buttons() == Qt::LeftButton) && isPress){if (mouse_press_region == kMousePositionMid){// 如果鼠标是在窗口的中间位置,就是移动窗口move(windowsLastPs + point_offset);}else {// 其他部分 是拉伸窗口// 获取客户区QRect rect = geometry();switch (mouse_press_region){// 左上角case kMousePositionLeftTop:rect.setTopLeft(rect.topLeft() + point_offset);break;case kMousePositionTop:rect.setTop(rect.top() + point_offset.y());break;case kMousePositionRightTop:rect.setTopRight(rect.topRight() + point_offset);break;case kMousePositionRight:rect.setRight(rect.right() + point_offset.x());break;case kMousePositionRightBottom:rect.setBottomRight(rect.bottomRight() + point_offset);break;case kMousePositionBottom:rect.setBottom(rect.bottom() + point_offset.y());break;case kMousePositionLeftBottom:rect.setBottomLeft(rect.bottomLeft() + point_offset);break;case kMousePositionLeft:rect.setLeft(rect.left() + point_offset.x());break;default:break;}setGeometry(rect);mousePs = ev->globalPos();}}
}void SPlay::SetMouseCursor(int x, int y)
{// 鼠标形状对象Qt::CursorShape cursor{};int region = GetMouseRegion(x, y);switch (region){case kMousePositionLeftTop:case kMousePositionRightBottom:cursor = Qt::SizeFDiagCursor; break;case kMousePositionRightTop:case kMousePositionLeftBottom:cursor = Qt::SizeBDiagCursor; break;case kMousePositionLeft:case kMousePositionRight:cursor = Qt::SizeHorCursor; break;case kMousePositionTop:case kMousePositionBottom:cursor = Qt::SizeVerCursor; break;case kMousePositionMid:cursor = Qt::ArrowCursor; break;default:break;}setCursor(cursor);
}int SPlay::GetMouseRegion(int x, int y)
{int region_x = 0, region_y = 0;// 鼠标的X坐标小于 边界5 说明他在最上层区域 第一区域if (x < kMouseRegionLeft){region_x = 1;}else if (x > (this->width()/*窗体宽度*/ - kMouseRegionRight/*边界宽度5*/)) {// 如果鼠标X坐标 大于 最右侧的边界 说明他在第三区域region_x = 3;}else {region_x = 2;}if (y < kMouseRegionTop){// 同理 鼠标Y坐标 小于上层边界5  说明鼠标在第一区域region_y = 1;}else if (y > (this->height() - kMouseRegionBottom)) {// 鼠标Y坐标的 大于 最下面的坐标,鼠标就在 第三区region_y = 3;}else {region_y = 2;}// 最后计算 表示区域的 数值 (x=1, y=1) 计算 = 1*10+1 =11 // x=2,y=3 = 3*10+2 = 32 在图的 3,2 区域return region_y * 10 + region_x;
}

2.QSizeGrip实现

#include <QApplication>
#include <QWidget>
#include <QVBoxLayout>
#include <QSizeGrip>int main(int argc, char *argv[])
{QApplication app(argc, argv);QWidget *widget = new QWidget;QVBoxLayout *layout = new QVBoxLayout(widget);widget->setLayout(layout);// 添加窗口内容// ...// 添加 QSizeGrip 控件QSizeGrip *sizeGrip = new QSizeGrip(widget);layout->addWidget(sizeGrip, 0, Qt::AlignBottom | Qt::AlignRight);// 设置窗口大小和位置widget->resize(400, 300);widget->move(100, 100);widget->show();return app.exec();
}

在这个示例中,我们首先创建一个QWidget对象和一个QVBoxLayout布局对象,并将布局设置为窗口的布局。然后,我们添加窗口的内容到布局中。

接下来,我们创建一个QSizeGrip对象,并将其添加到布局中的右下角。我们使用Qt::AlignBottom | Qt::AlignRight参数将QSizeGrip控件放置在窗口的右下角。

最后,我们设置窗口的大小和位置,并将其显示出来。

通过在无边框窗口中添加QSizeGrip控件,用户可以使用鼠标拖动控件来调整窗口的大小。

参考文章1:QT 创建一个 可移动、可拉伸的无边框窗体_qt 无边框窗口拉伸-CSDN博客

参考文章2:Qt实现无边框窗口实现拉伸的三种方法--附源码_qt 无边框窗口拉伸-CSDN博客

 参考小项目:https://github.com/a-mo-xi-wei/frameLessWindow

相关文章:

Qt实现无边框窗口的拖动和缩放

在使用QT创建窗体的时候&#xff0c;为了使窗口美化&#xff0c;通常不使用QT自带的边框。会调用下面函数去除窗体边框。 setWindowFlags(Qt::FramelessWindowHint) 但是有个问题&#xff0c;当去除了QT自带边框后&#xff0c;窗体就变得不能移动了&#xff0c;也不能改变窗口大…...

入门岛2-python实现wordcount并进行云端debug

书生大模型学习 任务&#xff1a; 1.实现一个wordcount函数&#xff0c;统计英文字符串中每个单词出现的次数。返回一个字典&#xff0c;key为单词&#xff0c;value为对应单词出现的次数。 2.Vscode连接InternStudio debug TIPS&#xff1a;记得先去掉标点符号,然后把每个单词…...

c语言-链表1

10 链表 一、链表是什么&#xff1f; -- 数据的一种存储方式 -- 链式存储 &#xff08;1&#xff09;线性存储 -- 地址连续 -- 自动开辟&#xff0c;自动释放 -- 默认是线性存储 &#xff08;2&#xff09;链式存储 -- 地址不连续…...

你好! Git——企业级开发模型

企业级开发模型&#xff08;6&#xff09; 一、删除远程分支&#xff0c;git branch -a &#xff08;查看所有本地分支与远程分支&#xff09;还能看到已经删除的分支&#xff0c;怎么解决&#xff1f;二、企业级开发流程2.1 企业级开发流程2.2 系统开发环境 三、Git分支设计模…...

力扣面试150 查找和最小的 K 对数字 最小堆 去重

Problem: 373. 查找和最小的 K 对数字 &#x1f468;‍&#x1f3eb; 参考题解 class Solution {public List<List<Integer>> kSmallestPairs(int[] nums1, int[] nums2, int k) {// 创建一个大小为 k 的结果列表&#xff0c;用于存储和最小的 k 个数对List<Li…...

Oceanbase 执行计划

test100 CREATE TABLE `test100` ( `GRNT_CTR_NO` varchar(32) COLLATE utf8mb4_bin NOT NULL COMMENT 担保合同编号, `GRNT_CTR_TYP` varchar(3) COLLATE utf8mb4_bin NOT NULL COMMENT 担保合同类型, `COLC_GRNT_IND` varchar(1) COLLATE utf8mb4_bin DEFAULT NULL …...

精品丨模型关系介绍

PowerBI中的模型关系相信小伙伴们都不会感觉到陌生&#xff0c;因为一份优秀的报表无法离开数据模型的支撑。 对比其它BI类工具而言&#xff0c;白茶认为其建模功能才是最为突出的功能点。 模型关系类型 PowerBI中我们常用的模型关系一共包含5类&#xff1a; 一对一关系(1:1) …...

CentOS7 配置 nginx 和 php 方案

配置方案 一、安装软件二、编写配置文件&#xff0c;连接PHP三、引用文件四、测试 鉴于网上教程错综复杂&#xff0c;写下一这篇文章 本教程只需要三步即可 一、安装软件 yum install -y nginx php php-fpm二、编写配置文件&#xff0c;连接PHP 一般情况下在安装完 nginx 后…...

Promise.all全面解析:使用方法与实战技巧

Promise是JavaScript中处理异步操作的重要机制&#xff0c;它提供了一种优雅的方式来处理异步回调&#xff0c;避免了传统回调地狱的问题。而Promise.all作为Promise的一个静态方法&#xff0c;更是在处理多个异步操作时发挥着关键作用。本文将全面解析Promise.all的使用方法&a…...

NLP从零开始------9文本进阶处理之文本相似度计算

1.文本相似度计算简介 在自然语言处理中&#xff0c;经常会涉及度量两个文本相似度的问题。在诸如对话系统和信息减速等中&#xff0c;度量句子或短语之间的相似度尤为重要。在新闻学传媒中应用文本相似度可以帮助读者快速检索到想要了解的报道。 文本相似度的定义式如下所示&a…...

Electron 在 MAC 上的 build 签名应用配置

Electron 在 MAC 上的 build 签名应用配置涉及多个步骤,包括准备开发者账号、生成证书和配置文件、配置环境变量以及使用适当的工具进行签名和公证。以下是一个详细的配置流程: 一、准备开发者账号 首先,你需要在 Apple 开发者网站 注册并拥有一个开发者账号。这个账号将用…...

15 交换机命令行配置

交换机命令行配置 一、交换机命令行基本配置 &#xff08;一&#xff09;配置主机名 Switch>enable Switch#configure terminal Switch(config)#hostname S1&#xff08;二&#xff09;查看配置信息 Switch#show running-config Building configuration...Current confi…...

工作流之Flowable与SpringBoot结合

文章目录 1 Flowable1.1 flowable-ui部署运行1.2 绘制流程图1.2.1 绘制1.2.2 绘图细节1.2.3 bpmn文件导入 1.3 后台项目搭建1.3.1 pom.xml1.3.2 数据库表说明 1.4 流程引擎API与服务1.4.1 主要API1.4.2 示例 1 Flowable 1.1 flowable-ui部署运行 flowable-6.6.0 运行 官方dem…...

python实战:数据分析基础知识

当涉及到数据分析和统计建模时&#xff0c;Python 提供了强大的工具和库&#xff0c;如 pandas、numpy、statsmodels 和 matplotlib。本文将以一个实际的案例为例&#xff0c;介绍如何利用这些工具进行回归分析&#xff0c;并通过可视化工具进行结果展示和解释。 1. 背景介绍 …...

Grafana深入讲解

Grafana 深入讲解 目录 概述Grafana 基本概念 2.1 Grafana 简介2.2 Grafana 功能特性2.3 Grafana 架构 Grafana 安装与配置 3.1 安装 Grafana3.2 配置 Grafana3.3 验证 Grafana 安装 Grafana 数据源 4.1 支持的数据源类型4.2 添加数据源4.3 配置 Prometheus 数据源 Grafana 仪…...

002 git

下载 使用git clone命令下载特定分支 打开终端或命令行界面。 使用cd命令切换到你想存放仓库副本的本地目录。 使用以下命令克隆仓库的develop分支到本地&#xff08;注意替换<仓库URL>为实际的仓库URL&#xff09;&#xff1a; git clone -b develop --single-branch…...

MySQL --- 用户管理

一、用户信息 MySQL中的用户信息&#xff0c;都存储在系统数据库mysql的表user中 user表的结构如下 这里主要介绍以下几个字段 host &#xff1a; 表示这个用户可以从哪个主机登陆&#xff0c;如果是 localhost &#xff0c;表示只能从本机登陆 user&#xff1a; 用户名 a…...

Linux 错误码

目录 一、概述二、含义三、错误处理函数1、IS_ERR2、strerr、perror 一、概述 在 Linux 系统中&#xff0c;错误码是用来表示操作系统运行过程中发生的错误的数字代码。错误码通常由负数表示&#xff0c;0 表示成功&#xff0c;正数表示警告或其他非致命错误。 为了开发者更好…...

《向量数据库指南》——开源社区与商业化的平衡

开源社区与商业化的平衡 Lynn:我觉得这个说的特别好,因为开发者工具其实有很多,但是事实上真正去做开源的这种社区的,尤其是做的比较大的,其实这样的企业还是比较少的。那么当初在起步的时候就这么坚定的去选择开源,然后这么短的时间能获得这么多产品反馈。其实让我想到那…...

记录一次echarts图表大数据量轮询刷新页面卡死问题的优化

项目场景: 在我们的项目架构中,集成的Echarts图表组件采用了折线图,业务需求即每300毫秒自动更新图表上的数据,并且每一次的数据点数量达到了约700个,折线图刷新的很快,每300毫秒就要刷新数据 问题描述 开发过程中发现在这种数据量请求频率下,大概2个小时左右就会导致…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

视觉slam--框架

视觉里程计的框架 传感器 VO--front end VO的缺点 后端--back end 后端对什么数据进行优化 利用什么数据进行优化的 后端是怎么进行优化的 回环检测 建图 建图是指构建地图的过程。 构建的地图是点云地图还是什么信息的地图&#xff1f; 建图并没有一个固定的形式和算法…...

mq安装新版-3.13.7的安装

一、下载包&#xff0c;上传到服务器 https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.13.7/rabbitmq-server-generic-unix-3.13.7.tar.xz 二、 erlang直接安装 rpm -ivh erlang-26.2.4-1.el8.x86_64.rpm不需要配置环境变量&#xff0c;直接就安装了。 erl…...

【Docker 02】Docker 安装

&#x1f308; 一、各版本的平台支持情况 ⭐ 1. Server 版本 Server 版本的 Docker 就只有个命令行&#xff0c;没有界面。 Platformx86_64 / amd64arm64 / aarch64arm(32 - bit)s390xCentOs√√Debian√√√Fedora√√Raspbian√RHEL√SLES√Ubuntu√√√√Binaries√√√ …...