我正在尝试编写一个简单的程序(没什么特别的),它具有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
dropEvent
和dragEnterEvent
函数对放置事件使用react的小部件。
制作自己的继承QListView
的类,并在其中定义dropEvent
和dragEnterEvent
:
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/