0
点赞
收藏
分享

微信扫一扫

Qt实现widget中从外部拖放入文件

飞进科技 2022-04-23 阅读 112
qt

CSDN看到的例子都是针对QMainWindow的,现在来测试一下QWidgets的拖放操作。

一下操作是QT4的,QT5请酌情参考。

首先,新建QT工程,选择QWidget模式:

接下来定义函数,并同时在cpp中实现。注意,如果只声明,不实现,会报错!

下面时实现:

这时候可以编译一下了,没问题通过。如果这里有问题,那么注意检查是不是声明有错误。

这一步证明:MainWindow和Widget同样可以实现dragEnterEvent和dropEvent。

接下来在widget上放置控件:

我只想实现将外部文件拖放如编辑框,所以就专门实现一下这个。

接下来写拖入的回调函数

widget.cpp



#include "widget.h"
#include "ui_widget.h"
#include <QDragEnterEvent>  //添加头文件
#include <QUrl>             //添加头文件

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}


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

// 放下事件
void Widget::dropEvent(QDropEvent *event)
{
    // 获取MIME数据
    const QMimeData *m = event->mimeData();
    // 如果数据中包含URL
    if(mimeData->hasUrls()){
        // 获取URL列表
        QList<QUrl> urlList = m->urls();
        // 将其中第一个URL表示为本地文件路径
        QString fileName = urlList.at(0).toLocalFile();
        // 如果文件路径不为空
        if(!fileName.isEmpty()){
            //  转为char*
            QByteArray qByteArrary = fileName.toLatin1();
            char* filePath = qByteArrary.data();
            //  判断当前控件是否被鼠标选中
            if(ui->lineEdit->underMouse()){
                ui->lineEdit->setText(filePath);
            }
        }
    }
}

就可以了。下面看一下效果

 拖入文件放入:

大功告成。 

 

 

举报

相关推荐

0 条评论