Qt 界面设置无边框之后如何实现缩放界面

news2025/2/28 15:22:24

在qt中,如果设置的了窗口无边框的话(即setWindowFlag(Qt::FramelessWindowHint);)那么窗口就没法直接被鼠标拖动了,也没法按住窗口的边界进行缩放。

如果要实现缩放和拖动,一般来说就需要的重写窗口类的mousePressEvent和mouseMoveEvent事件。

但是有些时候,比如在界面上放了一个QgraphicsView,主界面就没法响应mousePressEvent和mouseMoveEvent事件。因为该事件被QgraphicsView截取了。这个时候我们就不能简单得通过的重写主窗口的鼠标事件来实现窗口的拖动和缩放了。

我是这样实现的:

如下图所示,我在界面上放了4个qlabel,通过qlabel的raise()方法将他们置顶,这样,这些label就能获取到鼠标移动和点击事件了。

但是,我们是不能直接重写qlabel中的鼠标事件响应函数的,因为在qlabel中,鼠标事件的级别是protected,如下图:

 

所以这时候就需要我们自己写一个类,继承qlabel,代码如下:

Mylabel.h

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

#ifndef MYLABEL_H
#define MYLABEL_H

#include <QObject>
#include <QLabel>
#include <QDebug>
#include <QMouseEvent>
#include <qnamespace.h>
class myLabel:public QLabel
{
    Q_OBJECT
public:
    myLabel(QWidget *parent=nullptr);
    void setScaleCursor(int nshape = 0);
    void mousePressEvent(QMouseEvent *ev);
    void mouseMoveEvent(QMouseEvent *ev);
    void mouseReleaseEvent(QMouseEvent *ev);
    QPoint m_mousePointOld;
    bool m_bKeepDrag;
signals:
    void moveEventSig(QPoint point);
    void mouseReleasedSig();
};

#endif // MYLABEL_H

Mylabel.cpp

#include "mylabel.h"

myLabel::myLabel(QWidget *parent):m_bKeepDrag(false)
{
    this->setParent(parent);
}

void myLabel::setScaleCursor(int nshape)
{
    if(nshape == 1)//左右拉伸
    {
        setCursor(Qt::SizeHorCursor);   //改变光标形状
    }
    else if(nshape == 2)//上下拉伸
    {
        setCursor(Qt::SizeVerCursor);
    }
    else if(nshape == 3)//右下拉伸
    {
        setCursor(Qt::SizeFDiagCursor);
    }
    else //正常显示
    {
        setCursor(Qt::ArrowCursor);
    }

}

void myLabel::mousePressEvent(QMouseEvent *ev)
{
    if(ev->button() == Qt::LeftButton)
    {
        m_bKeepDrag = true;
        m_mousePointOld = ev->globalPos();
    }
}

void myLabel::mouseMoveEvent(QMouseEvent *ev)
{
   if(m_bKeepDrag)
   {
       const QPoint position = ev->globalPos() - m_mousePointOld; //the position of mainfrmae + (current_mouse_position - last_mouse_position)
           //move(position.x(), position.y());
       emit moveEventSig(position);
       m_mousePointOld = ev->globalPos();
   }
}

void myLabel::mouseReleaseEvent(QMouseEvent *ev)
{
    m_bKeepDrag = false;
    emit mouseReleasedSig();
}

在主界面的类中主要代码如下:
头文件里面定义这4个label

1     myLabel          *labelLft;
2     myLabel          *labelRit;
3     myLabel          *labelBot;
4     myLabel          *labelTop;

在cpp文件的构造函数中初始化这4个label,同时通过connect的方式建立信号槽,将label中的鼠标移动事件传给主窗口,从而控制主窗口边界的缩放

//上下左右的label,为了控制界面能够拖动拉伸
labelLft = new myLabel(this);
labelLft->setStyleSheet("QLabel {background-color: transparent;}");//设置背景透明
labelLft->raise();
labelLft->setScaleCursor(1);
connect(labelLft,&myLabel::moveEventSig,this,&MaxPicShowForm::getLeftScaleEvent);
labelRit = new myLabel(this);
labelRit->setStyleSheet("QLabel {background-color: transparent;}");//设置背景透明
labelRit->raise();
labelRit->setScaleCursor(1);//设置为左右拉升光标
connect(labelRit,&myLabel::moveEventSig,this,&MaxPicShowForm::getRightScaleEvent);
labelBot = new myLabel(this);
labelBot->setStyleSheet("QLabel {background-color: transparent;}");//设置背景透明
labelBot->raise();
labelBot->setScaleCursor(2);//设置为上下拉升光标
connect(labelBot,&myLabel::moveEventSig,this,&MaxPicShowForm::getBottomScaleEvent);
labelTop = new myLabel(this);
labelTop->setStyleSheet("QLabel {background-color: transparent;}");//设置背景透明
labelTop->setScaleCursor(2);//设置为上下拉升光标
connect(labelTop,&myLabel::moveEventSig,this,&MaxPicShowForm::getTopScaleEvent);
labelRB = new myLabel(this);
labelRB->setStyleSheet("QLabel {background-color: transparent;}");//设置背景透明
labelRB->setScaleCursor(3);//设置为右下拉升光标
connect(labelRB,&myLabel::moveEventSig,this,&MaxPicShowForm::getRBScaleEvent);
//设置4个label的位置:
labelLft->setGeometry(0,0,5,this->height());
labelRit->setGeometry(this->width()-5,0,5,this->height());
labelBot->setGeometry(0,this->height()-5,this->width(),5);
labelTop->setGeometry(0,0,this->width(),5);

响应鼠标拖动事件:

 1 void MaxPicShowForm::getLeftScaleEvent(QPoint movPoint)
 2 {
 3     if((pos().x()+movPoint.x())>(pos().x()+this->width()-200))
 4     {
 5         return;//保证拖动窗口左边界的时候,控件宽度至少有200
 6     }
 7     this->setGeometry(pos().x()+movPoint.x(),pos().y(),this->width()-movPoint.x(),this->height());
 8 }
 9 
10 void MaxPicShowForm::getRightScaleEvent(QPoint movPoint)
11 {
12     if((pos().x()+this->width()+movPoint.x())<(pos().x()+200))
13     {
14         return;//保证拖动窗口右边界的时候,控件宽度至少有200
15     }
16     this->setGeometry(pos().x(),pos().y(),this->width()+movPoint.x(),this->height());
17 }
18 
19 void MaxPicShowForm::getBottomScaleEvent(QPoint movPoint)
20 {
21     if((pos().y()+this->height()+movPoint.y())<(pos().y()+200))
22     {
23         return;//保证拖动窗口下边界的时候,控件高度至少有200
24     }
25     this->setGeometry(pos().x(),pos().y(),this->width(),this->height()+movPoint.y());
26 }
27 
28 void MaxPicShowForm::getTopScaleEvent(QPoint movPoint)
29 {
30     if((pos().y()+movPoint.y())>(pos().y()+this->height()-200))
31     {
32         return;//保证拖动窗口上边界的时候,控件高度至少有200
33     }
34     this->setGeometry(pos().x(),pos().y()+movPoint.y(),this->width(),this->height()-movPoint.y());
35 q}

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓ 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/39021.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

目标检测论文解读复现之十九:基于YOLOv5网络模型的人员口罩佩戴实时检测

前言 此前出了目标改进算法专栏&#xff0c;但是对于应用于什么场景&#xff0c;需要什么改进方法对应与自己的应用场景有效果&#xff0c;并且多少改进点能发什么水平的文章&#xff0c;为解决大家的困惑&#xff0c;此系列文章旨在给大家解读最新目标检测算法论文&#xff0…

8.3 数据结构——交换排序

基本思想&#xff1a;两两比较&#xff0c;如果发生逆序则交换&#xff0c;直到所有记录都排好序为止。 常见的交换排序&#xff1a;&#xff08;1&#xff09;冒泡排序 &#xff08;2&#xff09;快速排序 8.3.1 冒泡排序 基本思想&#xff1a;每趟不断将记录两两比较&…

VLAN(Virtual LAN)虚拟局域网

1、广播与广播域 广播&#xff1a;将广播地址做为目标地址的数据帧 广播域&#xff1a;网络中能接收到同一个广播所有节点的集合&#xff08;广播域越小越好&#xff0c;收到的垃圾广播越少&#xff0c;这样通信效率更高&#xff09; MAC地址广播 广播地址为&#xff1a;FF-FF-…

rabbitmq配置windows authentication(windows account)登录

rabbitmq配置windows authentication(windows account开启插件配置文件创建一个不需要密码的账号&#xff0c;赋予administrator权限。用windows账号和密码登录rabbitmq加密明文密码创建密钥的文件,添加密钥字符串加密解密用户名密码配置加密后的字符串重启rabbitmq&#xff0c…

HyperLynx(三十一)高速串行总线仿真(三)

高速串行总线仿真&#xff08;三&#xff09; 1.从一个多层板工程中验证串行通道 2.在多层板中设置连接器模型 1.从一个多层板工程中验证串行通道 在本例练习中&#xff0c;将集中研究从芯片到插件形成的串行发射通道&#xff0c;并分析它的性能。 (1)打开 HyperLynx 软件&a…

Centos下安装postgreSQL

最近北京yq严重&#xff0c;在家学习下postgreSQL &#xff0c;本次使用的是 Centos 环境安装是有&#xff0c;记录下来&#xff0c;方便备查。 第一步、下载与安装 下载地址&#xff1a;postgreSQL官网 在官网上选择 Linux系统&#xff0c;使用 yum来下载软件&#xff0c;只…

SpringBoot SpringBoot 原理篇 1 自动配置 1.11 bean 的加载控制【编程式】

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 原理篇 文章目录SpringBootSpringBoot 原理篇1 自动配置1.11 bean 的加载控制【编程式】1.11.1 bean 的加载控制1.11.2 环境…

[附源码]Python计算机毕业设计高校辅导员工作管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

现代密码学导论-15-多明文加密

目录 3.4更强的安全观念 3.4.1 多明文加密安全 多消息窃听实验 DEFINITION 3.18 多明文加密下的不可区分性 PROPOSITION 3.19 定义3.18强于定义3.8的事实证明 PROPOSITION 3.19 的证明 概率加密的必要性 THEOREM 3.20 3.4更强的安全观念 到目前为止&#xff0c;我们一…

MySQL 慢查询日志 使用方法浅析 日志定位与优化技巧

目录 前言 1、如何开启使用慢查询日志&#xff1f; 1.1 开启慢查询日志 1.2 设置慢查询阈值 1.3 确定慢查询日志的文件名和路径 1.3.1 查询MySQL数据目录 1.3.2 查询慢查询日志文件名 1.3.3 查询全局设置变量 1.3.4 查询单个变量命令 1.3.5 其他注意事项 2、如何定位并优…

备战2023蓝桥国赛-重新理解Prim和Kruskal算法

备战2023蓝桥国赛-重新理解Prim和Kruskal算法Prim算法Kruskal算法Prim算法 题目描述&#xff1a; 解析&#xff1a; prim算法跟dijkstra的朴素解法有很多相像部分&#xff0c;他们都是枚举中继节点来更新下一个节点&#xff0c;都是选最小的dist值来更新&#xff0c;时间复杂…

【线性表】—动态顺序表的增删查改实现

小菜坤日常上传gitee代码&#xff1a;https://gitee.com/qi-dunyan&#xff08;所有的原码都放在了我上面的gitee仓库里&#xff09; 数据结构知识点存放在专栏【数据结构】后续会持续更新 ❤❤❤ 个人简介&#xff1a;双一流非科班的一名小白&#xff0c;期待与各位大佬一起努…

【网页设计】期末大作业html+css(动漫网站)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

【机器学习项目实战10例】(十):DataCastle-租金预测

💥 项目专栏:【机器学习项目实战10例】 文章目录 一、DataCastle-租金预测二、数据集介绍三、导入相关库四、读取数据五、删除缺失值过多的列六、填补缺失数据七、特征编码八、简单跑一下九、可视化数据分布9.1 箱线图9.2 直方图和Q-Q图一、DataCastle-租金预测 本项目任务…

【ASM】字节码操作 工具类与常用类 AnalyzerAdapter 工作原理

文章目录 1.概述2.xx3.工作原理3.1初始状态3.2中间状态3.2.1顺序执行3.2.2发生跳转.2.3特殊情况: new对象3.3结束状态4.示例:打印方法的Frame4.2 编码实现5.总结1.概述 在上一篇文章: 【ASM】字节码操作 工具类与常用类 AnalyzerAdapter初步介绍 我们知道 AnalyzerAdapter 主…

Android开发java调用C简单示例

目录下载NDK和CMake新建NDK项目写入C代码&#xff0c;并运行本文使用的Android Studio版本是windows版Android Studio Bumblebee | 2021.1.1 Patch 2 先看下最终效果&#xff1a; 下载NDK和CMake 检查NDK和CMake是否已经下载了&#xff0c;这一步不难&#xff0c;具体步骤就…

工业动态界面设计 GLG Toolkit 4.2 Crack-GlgCE.4.2_x64

GLG Toolkit是为开发高级图形的动态界面而设计的框架&#xff1a;不只是简单的按钮和选单&#xff0c;而且是完全动画的图形对象&#xff0c;它能够显示动态数据和作出与用户交互的反应。它不仅是一个能够创建很多“漂亮的图片”绘图工具&#xff0c;而且它的图形引擎允许开发人…

Spring Boot 使用Docker构建运行

Docker 容器化 Spring Boot 应用 在应用容器化、容器编排大行其道的当下。今天来学习下如何使用Docker技术打包、构建、运行Spring Boot 应用程序&#xff0c;从最简单的Dockerfile开始&#xff0c;一步步的学习Docker 容器的使用过程。 Spring Boot 应用系统 创建项目 使用…

[足式机器人]Part3机构运动微分几何学分析与综合Ch02-3 平面机构离散运动鞍点综合——【读书笔记】

本文仅供学习使用 本文参考&#xff1a; 《机构运动微分几何学分析与综合》-王德伦、汪伟 《微分几何》吴大任 Ch02-3 平面机构离散运动鞍点综合2.4 鞍滑点2.4.1 鞍线与二副连架杆P-R2.4.2 鞍线误差2.4.3 三位置鞍线2.4.4 四位置鞍线2.4 鞍滑点 在平面机构运动综合时&#xff…

实验七 循环神经网络(2)梯度爆炸实验

目录6.2 梯度爆炸实验6.2.1 梯度打印函数【思考】什么是范数&#xff0c;什么是L2范数&#xff0c;这里为什么要打印梯度范数&#xff1f;6.2.2 复现梯度爆炸现象6.2.3 使用梯度截断解决梯度爆炸问题【思考题】梯度截断解决梯度爆炸问题的原理是什么&#xff1f;6.2 梯度爆炸实…