QT:Widget拖拽操作

基本概念

在 Qt 中,拖拽操作(Drag and Drop)提供了一种直观的用户交互方式,用于在应用程序内部或者不同应用程序之间移动或复制数据。它涉及两个主要的动作:拖动(Drag)和放置(Drop)。
拖动是指用户在一个部件(Widget)上按下鼠标,移动鼠标来 “抓起” 数据的过程;放置是指用户将 “抓起” 的数据移动到另一个部件上并松开鼠标,将数据 “放下” 的过程。

相关类和函数

QDrag 类:用于处理拖动操作。它封装了要拖动的数据以及相关的元数据,如数据格式、拖动的鼠标光标等信息。
QMimeData 类:用于存储拖动操作中的数据。它支持多种数据格式,如文本、图像、URL 等。例如,如果你想拖动一个文本字符串,你可以将这个字符串存储在 QMimeData 中。它通过调用 setText(对于文本数据)等方法来设置数据内容。
QDragEnterEvent、QDragMoveEvent、QDropEvent 事件类:这些事件类用于在拖动操作的不同阶段传递信息。
当被拖动的对象进入一个部件的边界时,会触发 QDragEnterEvent。部件可以通过重新实现 dragEnterEvent 函数来决定是否接受这个拖动操作。例如,一个只接受文本数据拖动的部件可以在这个函数中检查 QMimeData 的数据格式是否为文本。
当被拖动的对象在部件内部移动时,会触发 QDragMoveEvent。同样,部件可以通过重新实现 dragMoveEvent 函数来处理这个事件,如更新显示的反馈信息(比如改变鼠标光标形状等)。
当被拖动的对象在部件上被释放时,会触发 QDropEvent。部件通过重新实现 dropEvent 函数来处理放下的数据,如将数据插入到一个文本编辑器部件中。

新建项目

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

往界面上拖入一个Text Edit部件

在这里插入图片描述
然后在mainwindow.h文件中添加函数声明

protected:
    void dragEnterEvent(QDragEnterEvent *event) override; // 拖动进入事件
    void dropEvent(QDropEvent *event) override;           // 放下事件

mainwindow.cpp文件中添加头文件

#include<QDragEnterEvent>
#include<QUrl>
#include<QFile>
#include<QTextStream>
#include<QMimeData>

对两个事件处理函数进行定义

//拖动进入事件
void MainWindow::dragEnterEvent(QDragEnterEvent *event)
{
   
    //数据中是否包含URL
    if(event->mimeData()->hasUrls())
    {
   
        //进行接收动作
        event->acceptProposedAction();
    }else{
   
        event->ignore();//忽略该事件
    }

}

//放下事件
void MainWindow::dropEvent(QDropEvent *event)
{
   
    const QMimeData *mimedata = event->mimeData();//获取MIME数据
    if(mimedata->hasUrls()){
   
        QList<QUrl> urlList = mimedata->urls();//获取url
        QString fileName = urlList.at(0).toLocalFile();//将第一个URL表示为本地文件路径
        if(!fileName.isEmpty())//如果路径不为空
        {
   
            QFile file(fileName);//建立Qfile 并且以只读的方式打开文件
            if(!file.open(QIODevice::ReadOnly))
            {
   
                return;
            }
            QTextStream in(&file);//创建文本流对象
                ui->textEdit->setText(in.readAll())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

li星野

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值