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

【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 拖放事件

本节对应的视频讲解&#xff1a;B_站_链_接 【QT开发笔记-基础篇】 第4章 事件 4.7 拖动事件 本章要实现的整体效果如下&#xff1a; QEvent::DragEnter ​ 当拖动文件进入到窗口/控件中时&#xff0c;触发该事件&#xff0c;它对应的子类是 QDragEnterEvent QEvent::DragLe…...

【Linux】介绍 Docker 的基本概念和优势,以及在应用程序开发中的实际应用

Docker 是一种轻量级的虚拟化技术&#xff0c;它基于 Linux 容器技术&#xff0c;能够在不同平台、不同主机上快速地运行和部署应用程序。Docker 的基本概念包括以下几点&#xff1a; 镜像&#xff08;Image&#xff09;&#xff1a;Docker 镜像是一个只读的模板&#xff0c;它…...

GUN C/C++ undefined reference to symbol ‘dlclose@@GLIBC_2.2.5‘

编译问题&#xff1a; /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&#xff08;Rabbit Message Queue&#xff09;是一个开源的消息队列中间件&#xff0c;它实现了高级消息队列协议&#xff08;AMQP&#xff09;并提供可靠的消息传递机制。RabbitMQ 在分布式系统中广泛用于消息传递和事件驱动的架构。以下是一些 RabbitMQ 的重要知识点…...

【开发日常】insmod: error inserting ‘*.ko‘: -1 Unknown symbol in module原理分析

问题的起源是一次面试&#xff0c;面试官询问加载内核的时候&#xff0c;如果insmod失败&#xff0c;且提示Unknown symbol in module。请问我里面的原理是什么呢&#xff1f;为什么内核知道当前缺少的是这个symbol&#xff1f; 想了解下具体的原因。 首先是模拟一个环境。 写…...

圆弧插补【C#】

圆弧&#xff1a; 圆弧插补方法可以通过提供圆弧的起点、终点和半径来画弧。下面是一个用C#实现的圆弧插补方法的示例代码&#xff1a; public void DrawArc(Point startPoint, Point endPoint, int radius, bool isClockwise) {// 计算圆心坐标int centerX (startPoint.X e…...

Redis EmbeddedString

前言 Redis 写入键值对时&#xff0c;首先会先创建一个 RedisObject 对象来存储 Value。 如果写入的 Value 是字符串&#xff0c;那么 Redis 会再根据写入的字符串长度&#xff0c;来创建对应的 sdshdr 来存储字符串&#xff0c;最后把 RedisObject 的 ptr 指针指向 sdshdr。 …...

SpringMVC之WEB-INF下页面跳转@ModelAttributeIDEA tomcat控制台中文乱码问题处理

WEB-INF下页面跳转 ModelAttribute来注解非请求处理方法 用途&#xff1a;预加载数据&#xff0c;会在每个RequestMapping方法执行之前调用。 特点&#xff1a;无需返回视图&#xff0c;返回类型void IDEA tomcat控制台中文乱码问题处理 复制此段代码&#xff1a;-Dfile.e…...

利用ChatGPT练习口语

目录 ChatGPT 这两天发布了一个激动人心的新功能&#xff0c;App端&#xff08;包括iOS和Android&#xff09;开始支持语音对话以及图片识别功能。 这两个功能一如既往的优先开放给Plus用户使用&#xff0c;现在将App更新到最新版本&#xff0c;就能体验。 为什么说激动人心&a…...

【Django 01】环境搭配与项目配置

1. 介绍 https://github.com/Joe-2002/sweettalk-django4.2#readme Django 是一个使用 Python 编写的开源 Web 应用程序框架&#xff0c;它提供了一套用于快速开发安全、 可扩展和高效的 Web 应用程序的工具和功能。Django 基于 MVC&#xff08;Model-View-Controller&#xf…...

PyCharm配置运行参数

...

ChatGPT AIGC 实现Excel 交叉查找 Index+match 函数

行与列交叉多条件查找需求如下: 这个需求要使用Excel中最经典的组合函数Index+match函数。 函数公式可以交给ChatGPT AIGC来实现。 Prompt: 有一个表格A列为品牌,B列为月份,C列为销量,61行数据,请写出Excel函数公式根据E3单元格的品牌与F2单元格的月份查找对应的销量,…...

【前端学习】—多种方式实现数组拍平(十一)

【前端学习】—多种方式实现数组拍平&#xff08;十一&#xff09; 一、数组拍平 数组拍平也叫数组扁平化、数组拉平、数组降维&#xff0c;指的是把多维数组转化为一维数组。 二、使用场景 复杂场景下的数据处理&#xff08;echarts做大屏数据展示&#xff09; 三、如何实…...

智慧远程医疗服务:从零开始搭建互联网医院APP

互联网医院APP作为远程医疗服务的一部分&#xff0c;正在为患者和医生带来更便捷的医疗体验。本文将探讨如何从零开始构建一个互联网医院APP&#xff0c;包括关键步骤、技术要点和挑战。 一、确定项目目标和范围 在开始之前&#xff0c;您需要明确定义您的互联网医院APP的目标…...

ADAS可视化系统,让自动驾驶更简单 -- 入门篇

随着车载芯片的升级、技术的更新迭代&#xff0c;可视化ADAS逐渐变成汽车的标配走入大家的生活中&#xff0c;为大家的驾车出行带来切实的便捷。那么你了解HMI端ADAS的实现过程吗&#xff1f;作为ADAS可视化系统的入门篇&#xff0c;就跟大家聊一聊目前较常见的低消耗的一种ADA…...

探索低代码技术

低/无代码的高速发展&#xff0c;属于软件市场的选择&#xff0c;相较于传统编写代码的开发方式&#xff0c;低/无代码开发效率高、投入成本低、技术门槛也更低&#xff0c;未来更多软件应用将使用低/无代码技术完成&#xff0c;这也是趋势。 身为开发人员经常需要花大量时间在…...

头歌的数据库的第二次作业的答案

目录 MySQL-视图 第1关&#xff1a;创建所有保险资产的详细记录视图 第2关&#xff1a;基于视图的查询 MySQL数据库 - 连接查询 第1关&#xff1a;内连接查询 第2关&#xff1a;外连接查询 第3关&#xff1a;复合条件连接查询 MySQL数据库 - 子查询 第1关&#xff1a;…...

基于R329 SOC智能音响开发编译环境搭建

R329智能音响开发编译环境搭建 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?可加我微信hezkz17, 本群提供音频技术答疑服务, R329编译命令 source build/envsetup.sh lunch make -j4 pack 编译工程选择 baidu_panshan...

libplctag开源库的API介绍

文章目录 1 开源库概要2 API介绍2.1 Tag Model&#xff08;标签模型&#xff09;2.2 Status Codes&#xff08;状态码&#xff09;2.3 Versions and Checking Library Compatibility&#xff08;版本和检查库的兼容性&#xff09;2.4 Tag Life Cycle&#xff08;标签生命周期&a…...

智能化安全巡更巡查系统—提升安全管理效率

传统的巡检都是手工完成&#xff0c;记录、拍照&#xff0c;回到办公室打印表单再交给作业队伍整改&#xff0c;再去现场核实复查&#xff0c;流程繁琐&#xff0c;效率低。而且大部分工地为了减少麻烦&#xff0c;人员往往都是口头沟通&#xff0c;存在很大质量风险&#xff0…...

跨平台办公自动化:OpenClaw+千问3.5-27B同步多端文件

跨平台办公自动化&#xff1a;OpenClaw千问3.5-27B同步多端文件 1. 为什么需要跨平台文件同步&#xff1f; 作为一个常年需要在Windows和Mac双系统切换的开发者&#xff0c;我经历过无数次这样的尴尬时刻&#xff1a;在Mac上修改的文档忘传到Windows&#xff0c;开会时找不到…...

Symfony Monolog Bundle与现代日志系统:Sentry、Elasticsearch、Slack集成终极指南

Symfony Monolog Bundle与现代日志系统&#xff1a;Sentry、Elasticsearch、Slack集成终极指南 【免费下载链接】monolog-bundle Symfony Monolog Bundle 项目地址: https://gitcode.com/gh_mirrors/mo/monolog-bundle Symfony Monolog Bundle是Symfony框架中功能强大的…...

AI 生码:RAG 落地量化实践与体系搭建

一、背景&#xff1a;前端 AI 落地&#xff0c;RAG 成为核心关键 在前端与 AI 融合落地过程中&#xff0c;AI 生成 UI 代码、业务测试用例等核心场景&#xff0c;均依赖知识库能力支撑。当应用进入深水区&#xff0c;RAG&#xff08;检索增强生成&#xff09;的选型与优化&…...

手把手教你用Copilot插件在Obsidian里免费接入DeepSeek-R1(附硅基流动API密钥获取)

零成本解锁Obsidian智能助手&#xff1a;DeepSeek-R1全流程实战指南 在信息爆炸的时代&#xff0c;如何让个人知识管理工具具备AI思维能力&#xff0c;已成为数字笔记用户的核心诉求。Obsidian作为一款以本地优先为理念的Markdown笔记工具&#xff0c;其插件生态正逐步融入大语…...

wUU代码混淆实战指南:使用Obfuscar构建坚不可摧的安全防线

在当今数字化时代&#xff0c;保护.NET应用程序的源代码安全变得尤为重要。你是否担心自己的知识产权被轻易窃取&#xff1f;是否希望防止竞争对手通过反编译分析你的核心业务逻辑&#xff1f;今天&#xff0c;我将为你详细介绍一款强大的开源混淆工具——Obfuscar&#xff0c;…...

C++ 模板元编程在性能优化中的作用

C 模板元编程在性能优化中的作用 在现代C开发中&#xff0c;性能优化始终是开发者关注的核心问题之一。而模板元编程&#xff08;Template Metaprogramming, TMP&#xff09;作为一种编译期计算技术&#xff0c;能够在程序运行前完成复杂的逻辑处理&#xff0c;从而显著提升运…...

FC-CLIP实战:为什么说“卷积不死”?在开放词汇分割中冻结CLIP主干的深度解析与避坑指南

FC-CLIP技术解析&#xff1a;卷积架构在开放词汇分割中的不可替代性 当整个计算机视觉领域似乎都被Transformer架构席卷时&#xff0c;FC-CLIP论文却掷地有声地宣告"卷积不死"。这个看似反潮流的结论背后&#xff0c;隐藏着哪些被忽视的视觉归纳偏置&#xff1f;冻结…...

LeetCode 152. Maximum Product Subarray 题解

LeetCode 152. Maximum Product Subarray 题解 题目描述 给你一个整数数组 nums &#xff0c;请你找出数组中乘积最大的非空连续子数组&#xff08;该子数组中至少包含一个数字&#xff09;&#xff0c;并返回该子数组所对应的乘积。 示例 1&#xff1a; 输入&#xff1a;n…...

2026知识付费SaaS避坑指南:数据安全与系统稳定性实测,创客匠人为何值得托付?

在知识付费行业&#xff0c;大多数选型对比只关注“前台功能”&#xff1a;能不能卖课、能不能直播、有没有拼团。但真正决定生意生死的&#xff0c;往往是看不见的“底层能力”——数据是否安全&#xff1f;系统是否稳定&#xff1f;学员资产能否真正归你所有&#xff1f;过去…...

React Scroll Parallax核心组件详解:Parallax、ParallaxBanner和ParallaxProvider

React Scroll Parallax核心组件详解&#xff1a;Parallax、ParallaxBanner和ParallaxProvider 【免费下载链接】react-scroll-parallax &#x1f52e; React hooks and components to create parallax scroll effects for banners, images or any other DOM elements. 项目地…...