Qt-将文件拖放到ListView中

Qt - Drag and Drop File into ListView

本文关键字:ListView 拖放 文件 Qt-      更新时间:2023-10-16

我正在尝试编写一个简单的程序(没有什么特别的),它有一个QListView和一些按钮。

我的问题是:如何具体告诉QListView接受来自文件系统的拖放?

我目前有

setAcceptDrops(true)

这是可以的,但拖放可以在整个(主)窗口上工作。我只是想让它在文件被拖到QListView中时工作。

为什么不起作用?:

ui->listView->setAcceptDrops(true);

整个代码:

#include "player.h"
#include "ui_player.h"
#include <QListView>
Player::Player(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Player)
{
    ui->setupUi(this);
    setAcceptDrops(true);
    //This doesnt work:
    //ui->listView->setAcceptDrops(true);
}
Player::~Player()
{
    delete ui;
}
void Player::dropEvent(QDropEvent *ev)
{
    QList<QUrl> urls = ev -> mimeData() -> urls();
    foreach(QUrl url, urls)
    {
        qDebug() << url.toString();
    }
    ev->acceptProposedAction();
}
void Player::dragEnterEvent(QDragEnterEvent *ev)
{
    ev->acceptProposedAction();
}

您应该为QListView而不是QMainWindow重写这些事件函数。当您执行ui->listView->setAcceptDrops(true);时,QListView现在是通过调用其virtualdropEventdragEnterEvent函数来对丢弃事件作出反应的小部件。

创建自己的类,继承QListView并在其中定义dropEventdragEnterEvent

class MyListView
{
public:
    MyListView(QWidget *parent);                        // implement
protected:
    void dropEvent(QDropEvent *ev) override;            // implement
    void dragEnterEvent(QDragEnterEvent *ev) override;  // implement
};

您可能还想覆盖dragMoveEvent,如参考所述。