我正在尝试编写一个简单的程序(没什么特别的),它有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();
}
答案 0 :(得分:1)
您应该覆盖QListView
的这些事件函数,而不是QMainWindow
。当您执行ui->listView->setAcceptDrops(true);
时,QListView
现在是通过调用其virtual
dropEvent
和dragEnterEvent
函数来响应放置事件的窗口小部件。
创建自己的继承QListView
的类,并在其中定义dropEvent
和dragEnterEvent
:
class MyListView
{
public:
MyListView(QWidget *parent); // implement
protected:
void dropEvent(QDropEvent *ev) override; // implement
void dragEnterEvent(QDragEnterEvent *ev) override; // implement
};
您可能还想覆盖dragMoveEvent
,reference。