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