为什么在我的 Qt 应用程序内部无法在 QFileSystemModel 中进行拖放操作?

1 user-interface qt qfilesystemmodel

我有非常简单的代码,显示文件结构:

class MainWindow : public QMainWindow
{
    Q_OBJECT
private:
    Ui::MainWindow *ui;
    QFileSystemModel model;
    QTreeView treeView;
};

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    model.setRootPath(QDir::rootPath());
    ui->treeView->setModel(&model);
    ui->treeView>setSelectionMode(QAbstractItemView::SingleSelection);
    ui->treeView->setDragEnabled(true);
    ui->treeView->viewport()->setAcceptDrops(true);
    ui->treeView->setDropIndicatorShown(true);
    ui->treeView->setDragDropMode(QAbstractItemView::InternalMove);
    ui->treeView->setAcceptDrops(true);

    ui->tableView->setModel(&model);
}
Run Code Online (Sandbox Code Playgroud)

我可以选择文件并将其直接拖放到文件夹或桌面上,但是当我尝试在内部执行某些操作(移动或复制,无关紧要)时,它显示了此示例 - 甚至光标显示我无法删除 它似乎对我来说,我已经尝试了所有选项,我是不是忘记写一些东西或设置其他选项?

Ale*_*r V 5

我已经使用 QFileSystemModel 作为数据源实现了基于 QTreeView 的 UI 小部件,并为视图启用了拖放功能,但仍然看不到显示它已准备好进行“放置”操作的光标。我错过了什么?

看了类似的代码后根据经验回答你。为了解决接受掉落的物品,模型方面需要做更多的工作:

// MyFileSysModel is a child from model class used in your example.
// Mind that specific application drag and drop logic may differ.
// I in fact modified that from QSortFilterProxyModel-type of class
// but that should be similar.
Qt::ItemFlags MyFileSysModel::flags(const QModelIndex &index) const
{
    Qt::ItemFlags defaultFlags = QFileSystemModel::flags(index);

    if (!index.isValid())
        return defaultFlags;

    const QFileInfo& fileInfo = this->fileInfo(index);

    // The target
    if (fileInfo.isDir())
    {
        // allowed drop
        return Qt::ItemIsDropEnabled | defaultFlags;
    }
    // The source: should be directory (in that case)
    else if (fileInfo.isFile())
    {
        // allowed drag
        return Qt::ItemIsDragEnabled | defaultFlags;
    }

    return defaultFlags;
}
Run Code Online (Sandbox Code Playgroud)

...当然我们现在需要使用派生模型类:

class MainWindow : public QMainWindow
{
    Q_OBJECT
private:
    Ui::MainWindow *ui;
    MyFileSysModel model; // has virtual function member "flags"
    QTreeView treeView;
};
Run Code Online (Sandbox Code Playgroud)