【QT开发笔记-基础篇】| 第四章 事件QEvent | 4.7 拖放事件
本节对应的视频讲解:B_站_链_接
【QT开发笔记-基础篇】 第4章 事件 4.7 拖动事件
本章要实现的整体效果如下:

QEvent::DragEnter
当拖动文件进入到窗口/控件中时,触发该事件,它对应的子类是 QDragEnterEvent
QEvent::DragLeave
当拖动文件离开窗口/控件时,触发该事件,它对应的子类是 QDragLeaveEvent
QEvent::DragMove
当拖动文件在窗口/控件中移动时,触发该事件,它对应的子类是 QDragMoveEvent
QEvent::Drop
当拖动文件在窗口/控件中释放时,触发该事件,它对应的子类是 QDropEvent
本节通过一个向 QTextEdit 中拖放文本文件的案例,来讲解拖放事件
1. 自定义控件 TextEditX
自定义一个标签控件 TextEditX,让它继承自 QTextEdit,然后重写拖放相关的函数。
1.1 添加自定义控件类 TextEditX
首先,在左侧项目文件名上右键,然后选择 “添加新文件”,选择 “C++ Class”,如下:

新建类文件信息如下:

然后,把父类修改为 QTextEdit
来到 texteditx.h 将父类由 QWidget 修改为 QTextEdit,如下:
#include <QTextEdit>class TextEditX : public QTextEdit
{// ...
};
来到 texteditx.cpp 将父类由 QWidget 修改为 QTextEdit,如下:
#include "texteditx.h"TextEditX::TextEditX(QWidget* parent) : QTextEdit{parent}
{
}
1.2 重写拖放函数
首先,来到 textedit.h,声明这4个拖放函数:
#include <QDragEnterEvent>
#include <QDragLeaveEvent>
#include <QDragMoveEvent>
#include <QDropEvent>class TextEditX : public QTextEdit
{
protected:void dragEnterEvent(QDragEnterEvent* event);void dragMoveEvent(QDragMoveEvent* event);void dragLeaveEvent(QDragLeaveEvent* event);void dropEvent(QDropEvent* event);
};
然后,来到 textedit.cpp 实现这4个函数(这里仅仅是加一句打印):
TextEditX::TextEditX(QWidget* parent) : QTextEdit{parent}
{this->setAcceptDrops(true);
}void TextEditX::dragEnterEvent(QDragEnterEvent* event)
{qDebug() << "dragEnterEvent";// 判断是正常的文件,表明用户可以在这个窗口部件上拖放对象。// 默认情况下,窗口部件是不接受拖动的。Qt会自动改变光标来向用户说明这个窗口部件是不是有效的放下点event->acceptProposedAction();
}void TextEditX::dragMoveEvent(QDragMoveEvent* event)
{qDebug() << "dragMoveEvent";
}void TextEditX::dragLeaveEvent(QDragLeaveEvent* event)
{qDebug() << "dragLeaveEvent";
}void TextEditX::dropEvent(QDropEvent* event)
{qDebug() << "dropEvent";
}
1.3 将 TextEditX 显示到界面
来到 drag_widget.cpp,在构造函数中添加 TextEditX 控件,如下:
#include "texteditx.h"DragWidget::DragWidget(QWidget* parent) : QWidget{parent}
{QVBoxLayout* verticalLayout = new QVBoxLayout(this);verticalLayout->setSpacing(0);verticalLayout->setContentsMargins(10, 10, 10, 10);// 添加一个TextEditTextEditX* textEdit = new TextEditX(this);textEdit->setPlaceholderText("支持文件拖放的方式,来打开文件");verticalLayout->addWidget(textEdit);
}
此时运行程序,效果如下:

2. 实现打开文件功能
只需修改 dropEvent() 函数,如下:
void TextEditX::dropEvent(QDropEvent* event)
{qDebug() << "dropEvent";QList<QUrl> urls = event->mimeData()->urls();if ( urls.isEmpty() ) {return;}QString fileName = urls.first().toLocalFile();qDebug() << urls.first() << " : " << fileName;QFile file(fileName);if ( file.open(QIODevice::ReadOnly) ) {setPlainText(file.readAll());}
}
拖放一个桌面文件到 TextEditX 中,效果如下:

3. 实现鼠标滚轮放大字体
以上在 TextEditX 中显示的文本,字体大小固定,接下来实现,通过鼠标滚轮来设置字体大小
首先,在 texteditx.h 中,声明鼠标滚轮滚动的事件 wheelEvent(),如下:
class TextEditX : public QTextEdit
{
protected:void wheelEvent(QWheelEvent* e);
};
然后,实现 wheelEvent() 函数:
#include <QApplication>void TextEditX::wheelEvent(QWheelEvent* e)
{if ( QApplication::keyboardModifiers() == Qt::ControlModifier ) { // ctrl键的判断// zoomIn/zoomOut可以直接修改字体大小if ( e->delta() > 0 ) { // 滚轮远离使用者, 进行放大this->zoomIn();} else {this->zoomOut(); // 进行缩小}} else {QTextEdit::wheelEvent(e); // 调用父类的,否则无法实现文本的上下滚动。}
}
此时,运行效果如下:

相关文章:
【QT开发笔记-基础篇】| 第四章 事件QEvent | 4.7 拖放事件
本节对应的视频讲解:B_站_链_接 【QT开发笔记-基础篇】 第4章 事件 4.7 拖动事件 本章要实现的整体效果如下: QEvent::DragEnter 当拖动文件进入到窗口/控件中时,触发该事件,它对应的子类是 QDragEnterEvent QEvent::DragLe…...
【Linux】介绍 Docker 的基本概念和优势,以及在应用程序开发中的实际应用
Docker 是一种轻量级的虚拟化技术,它基于 Linux 容器技术,能够在不同平台、不同主机上快速地运行和部署应用程序。Docker 的基本概念包括以下几点: 镜像(Image):Docker 镜像是一个只读的模板,它…...
GUN C/C++ undefined reference to symbol ‘dlclose@@GLIBC_2.2.5‘
编译问题: /usr/bin/ld: ../../3rdParty/lib/libluajit.a(lj_clib.o): undefined reference to symbol dlcloseGLIBC_2.2.5 //usr/lib64/libdl.so.2: error adding symbols: DSO missing from command line collect2: error: ld returned 1 exit status make[1]: …...
RabbitMQ概述,死信队列
RabbitMQ(Rabbit Message Queue)是一个开源的消息队列中间件,它实现了高级消息队列协议(AMQP)并提供可靠的消息传递机制。RabbitMQ 在分布式系统中广泛用于消息传递和事件驱动的架构。以下是一些 RabbitMQ 的重要知识点…...
【开发日常】insmod: error inserting ‘*.ko‘: -1 Unknown symbol in module原理分析
问题的起源是一次面试,面试官询问加载内核的时候,如果insmod失败,且提示Unknown symbol in module。请问我里面的原理是什么呢?为什么内核知道当前缺少的是这个symbol? 想了解下具体的原因。 首先是模拟一个环境。 写…...
圆弧插补【C#】
圆弧: 圆弧插补方法可以通过提供圆弧的起点、终点和半径来画弧。下面是一个用C#实现的圆弧插补方法的示例代码: public void DrawArc(Point startPoint, Point endPoint, int radius, bool isClockwise) {// 计算圆心坐标int centerX (startPoint.X e…...
Redis EmbeddedString
前言 Redis 写入键值对时,首先会先创建一个 RedisObject 对象来存储 Value。 如果写入的 Value 是字符串,那么 Redis 会再根据写入的字符串长度,来创建对应的 sdshdr 来存储字符串,最后把 RedisObject 的 ptr 指针指向 sdshdr。 …...
SpringMVC之WEB-INF下页面跳转@ModelAttributeIDEA tomcat控制台中文乱码问题处理
WEB-INF下页面跳转 ModelAttribute来注解非请求处理方法 用途:预加载数据,会在每个RequestMapping方法执行之前调用。 特点:无需返回视图,返回类型void IDEA tomcat控制台中文乱码问题处理 复制此段代码:-Dfile.e…...
利用ChatGPT练习口语
目录 ChatGPT 这两天发布了一个激动人心的新功能,App端(包括iOS和Android)开始支持语音对话以及图片识别功能。 这两个功能一如既往的优先开放给Plus用户使用,现在将App更新到最新版本,就能体验。 为什么说激动人心&a…...
【Django 01】环境搭配与项目配置
1. 介绍 https://github.com/Joe-2002/sweettalk-django4.2#readme Django 是一个使用 Python 编写的开源 Web 应用程序框架,它提供了一套用于快速开发安全、 可扩展和高效的 Web 应用程序的工具和功能。Django 基于 MVC(Model-View-Controller…...
PyCharm配置运行参数
...
ChatGPT AIGC 实现Excel 交叉查找 Index+match 函数
行与列交叉多条件查找需求如下: 这个需求要使用Excel中最经典的组合函数Index+match函数。 函数公式可以交给ChatGPT AIGC来实现。 Prompt: 有一个表格A列为品牌,B列为月份,C列为销量,61行数据,请写出Excel函数公式根据E3单元格的品牌与F2单元格的月份查找对应的销量,…...
【前端学习】—多种方式实现数组拍平(十一)
【前端学习】—多种方式实现数组拍平(十一) 一、数组拍平 数组拍平也叫数组扁平化、数组拉平、数组降维,指的是把多维数组转化为一维数组。 二、使用场景 复杂场景下的数据处理(echarts做大屏数据展示) 三、如何实…...
智慧远程医疗服务:从零开始搭建互联网医院APP
互联网医院APP作为远程医疗服务的一部分,正在为患者和医生带来更便捷的医疗体验。本文将探讨如何从零开始构建一个互联网医院APP,包括关键步骤、技术要点和挑战。 一、确定项目目标和范围 在开始之前,您需要明确定义您的互联网医院APP的目标…...
ADAS可视化系统,让自动驾驶更简单 -- 入门篇
随着车载芯片的升级、技术的更新迭代,可视化ADAS逐渐变成汽车的标配走入大家的生活中,为大家的驾车出行带来切实的便捷。那么你了解HMI端ADAS的实现过程吗?作为ADAS可视化系统的入门篇,就跟大家聊一聊目前较常见的低消耗的一种ADA…...
探索低代码技术
低/无代码的高速发展,属于软件市场的选择,相较于传统编写代码的开发方式,低/无代码开发效率高、投入成本低、技术门槛也更低,未来更多软件应用将使用低/无代码技术完成,这也是趋势。 身为开发人员经常需要花大量时间在…...
头歌的数据库的第二次作业的答案
目录 MySQL-视图 第1关:创建所有保险资产的详细记录视图 第2关:基于视图的查询 MySQL数据库 - 连接查询 第1关:内连接查询 第2关:外连接查询 第3关:复合条件连接查询 MySQL数据库 - 子查询 第1关:…...
基于R329 SOC智能音响开发编译环境搭建
R329智能音响开发编译环境搭建 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?可加我微信hezkz17, 本群提供音频技术答疑服务, R329编译命令 source build/envsetup.sh lunch make -j4 pack 编译工程选择 baidu_panshan...
libplctag开源库的API介绍
文章目录 1 开源库概要2 API介绍2.1 Tag Model(标签模型)2.2 Status Codes(状态码)2.3 Versions and Checking Library Compatibility(版本和检查库的兼容性)2.4 Tag Life Cycle(标签生命周期&a…...
智能化安全巡更巡查系统—提升安全管理效率
传统的巡检都是手工完成,记录、拍照,回到办公室打印表单再交给作业队伍整改,再去现场核实复查,流程繁琐,效率低。而且大部分工地为了减少麻烦,人员往往都是口头沟通,存在很大质量风险࿰…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
