Qt - 将文件拖放到ListView中

时间:2015-11-20 18:48:48

标签: c++ qt

我正在尝试编写一个简单的程序(没什么特别的),它有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();
}

1 个答案:

答案 0 :(得分:1)

您应该覆盖QListView的这些事件函数,而不是QMainWindow。当您执行ui->listView->setAcceptDrops(true);时,QListView现在是通过调用其virtual dropEventdragEnterEvent函数来响应放置事件的窗口小部件。

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

class MyListView
{
public:
    MyListView(QWidget *parent);                        // implement

protected:
    void dropEvent(QDropEvent *ev) override;            // implement
    void dragEnterEvent(QDragEnterEvent *ev) override;  // implement
};

您可能还想覆盖dragMoveEventreference