【QT开发笔记-基础篇】| 第四章 事件QEvent | 4.7 拖放事件

news2025/1/17 5:56:41

本节对应的视频讲解: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);

    // 添加一个TextEdit
    TextEditX* 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);  // 调用父类的,否则无法实现文本的上下滚动。
    }
}

此时,运行效果如下:

最终效果

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

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

相关文章

IDEA2023.1版本新建Web项目并配置本地Tomcat

IDEA2023.1版本新建Web项目并配置本地Tomcat 一、新建Web项目 一、新建Web项目 由于我最初是新建了一个空项目作为工作空间的&#xff0c;所以这里选择直接新建module&#xff0c;如下所示。&#xff08;这里使用的是idea的newUI&#xff09; 新建module&#xff0c;输入信息…

基于RuoYi-Flowable-Plus的若依ruoyi-nbcio支持自定义业务表单流程(五)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 今天讲一下wf_demo表单的一些修改 1、demo的实现类修改如下&#xff1a; 主要是增加一个服务名称&#…

学信息系统项目管理师第4版系列30_信息系统管理

1. 管理方法 1.1. 技术底座构成了几乎所有业务模式的支柱 1.2. 信息系统是为组织用来生产和管理信息&#xff08;数据&#xff09;的技术&#xff08;“什么”&#xff09;、人员&#xff08;“谁”&#xff09;和过程&#xff08;“如何”&#xff09;的组合 1.3. 信息系统…

【nginx学习笔记】

1.正向代理&#xff1a;代理的是客户端&#xff0c;一般有明确的访问对象 比如&#xff1a;我现在通过v-p-n去访问YouTube&#xff0c;那么就是正向代理。 2.反向代理&#xff1a;代理的是服务器 最常见的就是web中&#xff0c;nginx去代理一群后端的服务器。 3.负载均衡&…

mac虚拟机,无法从apple store下载软件

问题&#xff1a;vmware版本为16pro&#xff0c;mac版本为10.14.6&#xff0c;网络可以正常访问互联网&#xff0c;apple id也正常登录了&#xff0c;但是从apple store下载软件&#xff0c;转了一会圈&#xff0c;就停掉了。 解决&#xff1a;后面使用了一个网上看到的方法&a…

ESDA in PySal (4):shape-measures:形状测量

ESDA in PySal (4)&#xff1a;shape-measures&#xff1a;形状测量 1.Measures of shape esda.shape 模块提供文献中使用的统计数据来测量多边形的结构和规则性。 这些测量值从非常简单&#xff08;例如长宽差&#xff09;到非常复杂&#xff08;例如归一化转动惯量&#xf…

以太网诊断协议DoIP(Ethernet Diagnostic Protocol DoIP)

系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 设计模式系列 期待你的关注哦&#xff01;&#xff01;&#xff01; 现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everythi…

【4】c++11新特性(稳定性和兼容性)—>final关键字

c中增加了final关键字来限制某个类不能被继承&#xff0c;或者某个虚函数不能被重写。如果使用final修饰函数&#xff0c;只能修饰虚函数&#xff0c;并且放在类或者函数的后面。 修饰函数 #include <iostream> using namespace std;class Base { public:virtual void t…

在 Ubuntu 22.04安装配置 Ansible

一、按官网指引安装 我使用的ubuntu22.04版本&#xff0c;使用apt安装。官网指引如下&#xff1a; $ sudo apt-get install software-properties-common $ sudo apt-add-repository ppa:ansible/ansible $ sudo apt-get update $ sudo apt-get install ansible 由于内部网络…

《动手学深度学习 Pytorch版》 9.1 门控循环单元(GRU)

我们可能会遇到这样的情况&#xff1a; 早期观测值对预测所有未来观测值具有非常重要的意义。 考虑一个极端情况&#xff0c;其中第一个观测值包含一个校验和&#xff0c;目标是在序列的末尾辨别校验和是否正确。在这种情况下&#xff0c;第一个词元的影响至关重要。我们希望有…

《数理统计》第4章

文章目录 第4章4.4.1 协方差 第4章 4.4.1 协方差

项目平台——测试报告的实现(七)

这里写目录标题 一、Table表格组件的使用1、Table表格组件中的插槽使用 二、点击查看测试报告&#xff0c;跳转到测试报告详情页实现1、新建Report.vue组件2、配置路由3、查看报告按钮添加事件 三、页面布局1、Layout布局2、卡片设计3、打开页面发送请求加载报告数据4、对接口进…

如何优化前端可访问性(Accessibility)?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

如何修复-谷歌浏览器-打开任何一个网页都显示崩溃

早上上班&#xff0c;一如既往的使用谷歌浏览器时&#xff0c;发现异常。 首先是&#xff0c;右下角有个弹窗提示某某插件需要点击更新&#xff0c;然后点了也没用&#xff0c;然后就是打开任何网页都提示‘喔唷 崩溃了’的字眼。 奇怪呀&#xff0c;咱也是第一次碰见这种问题…

使用Proxyman抓取Android的https请求

使用Proxyman抓取Android的https请求 有时&#xff0c;您可能需要测试您的移动应用程序并检查与其关联的所有网络请求。在网络上&#xff0c;此任务非常简单&#xff0c;只需按Ctrl Shift I打开开发人员工具即可。从那里&#xff0c;您可以导航到网络选项卡并检查与网页相关的…

绝对有效,牛津《书虫》全系列完整版( 电子书+MP3 )

&#x1f600;前言 因为像看一下牛津《书虫》系类的&#xff08;PDF和音频&#xff09;找了许久不是链接过期就是要密码要会员太烦了所以在这里整理好打包给大家 在文章末尾 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是尘觉&#xff0c;希望我的文章可以帮助到大…

java打包解包总结

使用别人的jar包程序&#xff0c;需要修改其中的相关参数然后重新打包&#xff0c;在此记录一下打包和解包过程。 目录 1.解包操作 2.打包操作 1.解包操作 原始jar包文件 解包 jar xvf test.jar 或者 jar -xvf test.jar 2.打包操作 原始文件 打包&#xff1a; jar cvM0…

Aroid问题笔记 - ViewPager嵌套RecyclerView,降低ViewPager灵敏度

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&…

强大的下载管理器:Progressive Downloader for Mac

Progressive Downloader for Mac是一种强大的下载管理器&#xff0c;它可以帮助用户更快速、更稳定地下载文件。相比于其他下载工具&#xff0c;PD下载管理器具有很多独特的功能和优势&#xff0c;本文将对其进行详细推广。 在数字化时代&#xff0c;下载已成为我们日常工作中必…

C语言实现已知 XYZ+YZZ=532,其中 X,Y 和 Z 为数字,求出 X,Y 和 Z 的值

完整代码&#xff1a; // 已知 XYZYZZ532,其中 X,Y 和 Z 为数字&#xff0c;编写程序求出 X,Y 和 Z 的值#include<stdio.h>int main(){for (int X 1; X < 10; X){for (int Y 1; Y < 10; Y){for (int Z 0; Z < 10; Z){if ((X*100Y*10ZY*100Z*10Z)532){printf…