C++ Qt-将文件拖放到ListView中

C++ Qt-将文件拖放到ListView中,c++,qt,C++,Qt,我正在尝试编写一个简单的程序(没有什么特别的),它有一个QListView和一些按钮 我的问题是: 我如何明确地告诉QListView接受文件系统中的拖放操作 我现在有 setAcceptDrops(true) 这是可以的,但是拖放可以在整个(主)窗口上工作。我只希望在将文件拖到QListView中时它能够工作 为什么这不起作用 ui->listView->setAcceptDrops(true); 整个代码: #include "player.h" #include "ui_p

我正在尝试编写一个简单的程序(没有什么特别的),它有一个
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();
}
#包括“player.h”
#包括“ui_player.h”
#包括
播放器::播放器(QWidget*父项):
QMainWindow(父级),
用户界面(新用户界面::播放器)
{
用户界面->设置用户界面(此);
setAcceptDrops(真);
//这不起作用:
//ui->listView->setAcceptDrops(真);
}
玩家::~Player()
{
删除用户界面;
}
无效播放器::dropEvent(QDropEvent*ev)
{
QList url=ev->mimeData()->url();
foreach(QUrl url,url)
{
qDebug()接受建议动作();
}
无效玩家::dragEnterEvent(QDragEnterEvent*ev)
{
ev->acceptProposedAction();
}

您应该覆盖
QListView
的这些事件函数,而不是
QMainWindow
。当您执行
ui->listView->setAcceptDrops时(true);
QListView
现在是一个小部件,通过调用其
虚拟
dropEvent
DragentereEvent
函数,对拖放事件做出反应

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

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

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

您可能还希望覆盖
dragmovevent

我的答案是否解决了您的问题?如果是,请将其标记为已接受。我有一个“Player”-类,它继承QMainWindow并设置ui,我有一个您建议的类“MyListView”,它继承了QListView。但我不知道如何将所有内容组合在一起。你能给我一个基本的例子吗?当我使用自定义小部件时,我必须在主窗口的构造函数中使用命令来构建我的ui,因为我无法使小部件升级工作,原因是……我从来没有这样做过,但这里有一个和一些。不知道w如果我应该在这里说,但是甚至有YouTube视频。关键字:qt promote widget小部件升级成功了吗?我用你建议的类解决了问题。我创建了一个指向对象的指针:
myList=new MyListView(ui->listView)
在MyListView的构造函数中,我将小部件作为参数,并设置
setAcceptDrops(true);
。非常感谢