目录

创作背景

开发环境

运行效果

实现原理

1.参考文档

2.主要原理

实现过程

1.首先是重写QLabel

2.第二步是使用自己写的Label类

总结


创作背景

        写这篇文章主要有一下几点原因。第一个呢就是小白学习qt,准备实现拖拽效果但是不会写。再一个就是在网上找到的教程都是参差不齐,没找到特别详细的,对小白友好的教程。所以在研究透彻之后供大家参考。有不正确的地方还请大家指正。

开发环境

        QT5.12.2 + win11 +minggw73

运行效果

实现原理

1.参考文档

Qt拖拽,官方文档http://xn--gqq717c/

MimaData文档https://doc.qt.io/archives/qt-5.5/qmimedata.html#setImageData

2.主要原理

以QLabel为例,当鼠标按住QLabel会触发mousePressEvent(QMouseEvent *a_event)事件

,当你按住这个QLabel拖动一段距离时,会触发mouseMoveEvent(QMouseEvent *a_event)

事件。当鼠标拖动一个QLabel进入另外一个QLabel【也可以是它自己】时,会触发dragEnterEvent(QDragEnterEvent *a_event)事件,当鼠标拖动一个QLabel进入另外一个QLabel【也可以是它自己】并且松开鼠标时会触发dropEvent(QDropEvent *a_event)。

但是,QLabel封装的时候并没有在这几个事件触发时添加处理逻辑。所以需要创建一个QLabel的子类,来重写这些事件函数,并且添加处理逻辑。

好了,到此为止。需要用到的主要事件和在哪里触发就说完了。

实现过程

1.首先是重写QLabel

.h头文件

#ifndef DROPQLABEL_H
#define DROPQLABEL_H
#include<QLabel>
#include<QDragEnterEvent>
#include<QMimeData>
#include<QDrag>
#include<QDebug>
#include<QApplication>class DropQLabel : public QLabel//公开继承QLabel
{Q_OBJECT
public:DropQLabel(QWidget *parent = nullptr);~DropQLabel();//重写鼠标放下时事件处理函数void dropEvent(QDropEvent* a_event);//重写鼠标拖入时事件处理函数void dragEnterEvent(QDragEnterEvent* a_event);//重写鼠标按住时事件处理函数void mousePressEvent(QMouseEvent *a_event);//重写鼠标移动时事件处理函数void mouseMoveEvent(QMouseEvent *a_event);};#endif // DROPQLABEL_H

.cpp文件

#include "dropqlabel.h"DropQLabel::DropQLabel(QWidget *parent):QLabel(parent)//调用父类的构造函数
{//构造函数中可以没有内容,但是必须实现
}DropQLabel::~DropQLabel()
{//析构函数也是,可以没有内容但是必须实现
}
//鼠标放下的事件
void DropQLabel::dropEvent(QDropEvent *a_event)
{QString a="我接受到拖拽内容了,内容是:"+a_event->mimeData()->text();//解析mamiData中携带的信息qDebug()<<a;
}
//鼠标拖入的事件
void DropQLabel::dragEnterEvent(QDragEnterEvent *a_event)
{// 如果拖动的事件中有Text,则允许drop。如果没有Text则不允许放下if (a_event->mimeData()->hasText()){// 如果未调用,则无法dropa_event->acceptProposedAction();}
}void DropQLabel::mousePressEvent(QMouseEvent *a_event)
{}void DropQLabel::mouseMoveEvent(QMouseEvent *a_event)
{if (a_event->buttons() & Qt::LeftButton)//判断是否时鼠标的事件,且为左键则执行{QApplication::startDragDistance())//Qt中拖拽时需要生成一个Drag对象,才能实现拖拽这些事件声明也可以放在mousePressEvent(QMouseEvent *a_event)函数中QDrag *drag = new QDrag(this);//拖拽时也必须声明一个MimeData可以用来传递信息,如果不需要传递信息也要声明并且调用drag的setMimeData()函数,否则会报错。QMimeData *mimeData = new QMimeData;QString labelText=this->text();QString a="我开始被拖拽了,发送的拖拽内容是:"+this->text();this->setText(a);//可以调用mimeData的各种方法设置想要mimeData传递的信息mimeData->setText(labelText);drag->setMimeData(mimeData);drag->exec();//最后调用exec()即可}}

QLabel的重写工作完成之后,也就完成了大半。

2.第二步是使用自己写的Label类

在QtCreator的ui编辑器中拖入一个QLabel右键单击,在快捷菜单中选择“提升为”选项。

在弹出的对话框中输入类名,点击添加

添加成功后选中类,点击对话框底部的提升按钮。

看到下图处,类名改变则表示提升成功。

最后在mainWindow的cpp代码构造函数中允许放下的动作setAcceptDrops(true);

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);DropQLabel* aa=this->findChild<DropQLabel *>("bbb");DropQLabel* bb=this->findChild<DropQLabel *>("aaa");//设置允许放下动作bb->setAcceptDrops(true);//再设置父UI框架为允许放下,否则会失败。this->setAcceptDrops(true);}MainWindow::~MainWindow()
{delete ui;
}

至此,所有工作已经完成。

总结

大致步骤就是:重写QLabel=>使用自己写的控件=>在主窗口中设置允许鼠标放下动作。

然后就是:

Qt开发任重道远,加油吧!!

Qt中自定义控件拖拽,QT实现拖拽功能--小白友好版相关推荐

  1. QT中自定义控件和插件大致方法

    文章目录 前言 一.方法:右键提升为 二.方法:变为qt插件,作为ui使用 总结 前言 Qt中自带的控件有时候无法满足项目需求,这就需要在原有的控件或者重新编写代码. 一.方法:右键提升为 该方法主要 ...

  2. QT:在QT中调用摄像头并实现简单的拍照功能

    要在QT中使用摄像头,就要链接多媒体模块以及多媒体工具模块: QT += multimedia QT += multimediawidgets 废话少说,直接上代码,想说的都在代码里面斜体样式: ma ...

  3. Qt Designer自定义控件创建、使用

    Qt Designer自定义控件创建.使用 如何创建一个自定义的QWidget控件并导入Qt Designer 中进行使用? 一.创建Qt Designer自定义控件 第一步: 创建Qt Design ...

  4. QT 中QTimer 和 startTimer()的区别

    最需要注意一点 请注意,QTimer的准确性取决于底层操作系统和硬件.timerType参数允许您自定义计时器的准确性.有关不同计时器类型的信息,请参见Qt::TimerType.大多数平台支持20毫 ...

  5. 【C 语言】Windows 下使用 gcc 编译器 ( 常用的编译器 | Qt 中的 gcc 编译器 | 独立安装 MinGW )

    文章目录 一.常用的编译器 二.使用 Qt 中的 gcc 编译器 三.独立安装 MinGW 一.常用的编译器 常用编译器 : MSVC GCC MinGW CLANG ; MSVC : 微软 Micr ...

  6. Qt中的缓冲区QBuffer

    文章目录 1 Qt中的缓冲区QBuffer 1 Qt中的缓冲区QBuffer Qt中缓冲区的概念: 缓冲区的本质为一段连续的存储空间. QBuffer是Qt中缓冲区相关的类. 在Qt中可以将缓冲区看作 ...

  7. Qt中的QTimer

    文章目录 1 Qt中的QTimer 1 Qt中的QTimer 计时器的概念: 计时器是工程开发中非常重要的角色. 计时器用于每隔一定的时间触发一个消息. 计时器消息最终会被转换为函数调用. 宏观上: ...

  8. Qt中的QStackedLayout

    文章目录 1 Qt中的QStackedLayout 1 Qt中的QStackedLayout 栈式布局管理器(QStackedLayout): 所有组件在垂直于屏幕的方向上被管理. 每次只有一个组件会 ...

  9. Qt中的QPrintDialog

    文章目录 1 Qt中的QPrintDialog 1 Qt中的QPrintDialog 打印对话框: Qt中提供了预定义的打印对话框QPrintDialog类. QPrintDialog类用于设置打印相 ...

最新文章

  1. 查询选修c语言课程的学生学号和姓名,数据库实验(学生信息表)
  2. 工程之道,深度学习推理性能业界最佳优化实践
  3. 在香蕉派的树莓派系统上配置 Syncthing 自启动(暨 Linux 软件自启服务配置)
  4. 1190 最小公倍数之和 V2
  5. MiniProfiler 兼容 Entity Framework 6
  6. 如何用Html+css3写一个简单的网页
  7. javascript实现下拉条联动_JavaScript gt;gt;gt; 003
  8. 第一波养老目标基金来袭及9个看点回顾
  9. PostgreSQL如何自动更新时间戳?
  10. 同济大学 线性代数 第六版 pdf_线性代数同济第六版第五章课后习题答案!
  11. Java分布式系统框架教程,架构设计
  12. 常见的几种IDEA使用技巧
  13. 《缠中说禅108课》63:替各位理理基本概念
  14. 微信分享按钮隐藏、显示问题和注意事项
  15. github软件---百度网盘加速
  16. python字典经典例题_Python小白--------基础练习题(列表,元组,字典)
  17. [工具]更新音乐下载网站,MP3音乐无损音乐下载器
  18. Linux下deb安装包的安装教程
  19. 分子对接教程 | (6) AutoDock对接操作与对接结果解读
  20. 《计算机网络-谢希仁》读书笔记---概述

热门文章

  1. vibrator android,Android:Vibrator
  2. C++课程设计学生宿舍管理信息系统
  3. linux系统下,gsl 编译问题 -undefined reference to `cblas_xxx`
  4. 编译livox ros driver2(ROS2、livox、rviz、ubuntu22.04)
  5. 信创操作系统--统信UOS桌面版(控制中心:账户、自定义、个性化、声音、日期、电源管理、网络、蓝牙、输入法、系统更新等设置)
  6. OTA升级 之 Recovery模式
  7. 安装SQL server2012 安装成功但失败失败的解决方法
  8. .sql文件导入错误
  9. PyTorch 60 分钟入门教程中的一些疑惑
  10. 2018河北计算机会考成绩查询,2018年河北会考成绩查询时间及入口