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

我的问题是:
我如何具体告诉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是通过调用其virtual dropEventdragEnterEvent函数对放置事件使用react的小部件。

制作自己的继承QListView的类,并在其中定义dropEventdragEnterEvent:

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

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

您可能还需要按照reference的说明覆盖dragMoveEvent

关于c++ - Qt-将文件拖放到ListView中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33833945/

10-11 07:59