通过一个简短的程序来实现简单的拖放功能。该程序功能是:将.txt文本文件拖入主窗口,并在TextEdit部件中将文本文件内容显示出来。要实现这个功能,需要重新实现dragEnterEvent()拖入事件以及dropEvent()放下事件,现在ui界面添加一个TextEdit部件,然后重新实现上述两个事件,最后在打开主窗口拖入设置。整个程序代码如下所示:
头文件:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
protected:
void dragEnterEvent(QDragEnterEvent * event); //拖动进入事件
void dropEvent(QDropEvent *event); //拖动放下事件
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
源文件:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDragEnterEvent>
#include<QUrl>
#include<QFile>
#include<QTextStream>
#include<QMimeData>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
setAcceptDrops(true); //打开主窗口接收拖放事件
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::dragEnterEvent(QDragEnterEvent *event) //拖动进入事件
{
if(event->mimeData()->hasUrls()) //查看数据是否有URL
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();
if(!fileName.isEmpty()){
QFile file(fileName);
if(!file.open(QIODevice::ReadOnly)) return;
QTextStream in(&file); //建立文本流对象
ui->textEdit->setText(in.readAll()); //将文件内容读入编辑器
}
}
}
注意:最后一定要在构造函数中通过setAcceptDrops(true)打开主窗口拖放设置,不然主窗口默认是不接收文件的。