QT5 拖拽事件

时间:2019-11-16
本文章向大家介绍QT5 拖拽事件,主要包括QT5 拖拽事件使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

我们在编写文本编辑器的时候,可能会希望其具有支持这种功能,将文件直接拖入文本编辑器器打开。

使用方法

  • 1.包含头文件
//拖拽事件
#include <QDragEnterEvent>
//放下事件
#include <QDropEvent>
  • 2.在类中加上如下声明
    • 1)void dragEnterEvent(QDragEnterEvent *event);
    • 2)void dropEvent(QDropEvent *event);
class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;

    //复写”拖拽事件“函数
    void dragEnterEvent(QDragEnterEvent *event);

    //复写”放下事件“函数
    void dropEvent(QDropEvent *event);
};
  • 3.在类的构造函数中设置接受drop事件
//拖拽事件, 也就是可以直接将要打开的文件, 拖入此窗口打开
this->setAcceptDrops(true);
  • 4.复写“拖拽事件”函数
void MainWindow::dragEnterEvent(QDragEnterEvent *event)
{
    if(event->mimeData()->hasUrls())
    {
        event->acceptProposedAction();
    }
    else
    {
        event->ignore();
    }
}
  • 5.复写“放下事件”函数
void MainWindow::dropEvent(QDropEvent *event)
{
    const QMimeData *mimeData = event->mimeData();

    if(!mimeData->hasUrls())
    {
        return;
    }

    QList<QUrl> urlList = mimeData->urls();

    //如果同时拖入了多个资源,只选择一个
    QString fileName = urlList.at(0).toLocalFile();
    if(fileName.isEmpty())
    {
        return;
    }

    //打开拖入的文件
    QFile file(fileName);
    if(!file.open(QIODevice::ReadOnly))
    {
        QMessageBox::information(this, "错误", file.errorString(), QMessageBox::Ok);
        return;
    }

    //将文件内容放入文本框
    QByteArray ba;
    ba = file.readAll();
    ui->textEdit->setText(QString(ba));
}
  • 6.效果
    • 1)拖入mainWindow,也就是我的主窗口

这表示是成功的,注意这里拖入的是mainWindow

* 2)拖入textEdit和mainWindow的重叠区域

这里显然是失败的,为什么会这样?

我的窗口里面有一个textEdit,textEdit也能接受drop事件

原文地址:https://www.cnblogs.com/risesource/p/11873877.html