提问者:小点点

在Qt中复制,剪切,粘贴,重命名,撤消和重做


我有一个窗口,它有两个小部件:QTreeView和QListView。 我在QTreeView中选择一个文件夹,并在QTreeView中显示其内容。

void MainWindow::ListDirectory(QString arg_smb_path)
{
    o_directorySystemModel = new QFileSystemModel(this);
    o_directorySystemModel->setFilter(QDir::NoDotAndDotDot | QDir::AllDirs);
    o_directorySystemModel->setRootPath(arg_smb_path);

    ui->treeView->setModel(o_directorySystemModel);
    ui->treeView->hideColumn(1);
    ui->treeView->hideColumn(2);
    ui->treeView->hideColumn(3);


    o_fileSystemModel = new QFileSystemModel(this);
    o_fileSystemModel->setFilter(QDir::NoDotAndDotDot | QDir::Files);
    o_fileSystemModel->setRootPath(arg_smb_path);

    ui->listView->setModel(o_fileSystemModel);
    ui->listView->setContextMenuPolicy(Qt::CustomContextMenu);
    connect(ui->listView, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(ShowContextMenu(const QPoint&)));
}

此外,当我将鼠标悬停在QListView上时,我有一个弹出菜单。

void MainWindow::ShowContextMenu(const QPoint &arg_pos)
{
    // for QAbstractScrollArea and derived classes you would use:
    // QPoint globalPos = myWidget->viewport()->mapToGlobal(pos);
    QPoint l_globalPos = ui->listView->mapToGlobal(arg_pos);

    QMenu l_contextMenu;
    l_contextMenu.addAction("Copy");
    l_contextMenu.addAction("Cut");
    l_contextMenu.addAction("Paste");
    l_contextMenu.addAction("Rename");
    l_contextMenu.addAction("Attribute");

    QAction* l_selectedItem = l_contextMenu.exec(l_globalPos);
    if (l_selectedItem)
    {
        // something was chosen, do stuff
    }
    else
    {
        // nothing was chosen
    }
}

我想知道我如何做一个复制,剪切,重命名,撤消,和重做可能太。 我想在listView中选择一个文件,然后对该文件尝试此操作。 我如何实施这样的行动?


共1个答案

匿名用户

QFile提供了复制,删除,重命名和moveToTrash功能,您可以使用这些功能来实现您想要的文件操作。

要实现复制/剪切和粘贴操作,您可以将复制时的文件路径保存在某个变量以及boolcopyfile(与移动相反)中,在粘贴操作中,您(可以)在执行qfile::copy()之后清除该变量

为了实现撤消/重做功能,Qt提供了QundoStack。 基本上,您为每个操作(复制,重命名等)创建QUndoCommands,这些操作提供undo()和redo()函数。 例如,copy操作对应于QUndoCommand,它在redo()上进行复制,在undo()上删除副本。

所以最后你会以一堆继承QundoCommand的类告终:

  • CopyCommand(将保存所选文件路径以备以后粘贴,或在撤消时重置剪贴板)
  • CutCommand(与CopyCommand相同,但将CopyFile设置为false,则它们可能是具有成员的同一个类)
  • RenameCommand(它将在redo()时重命名,在undo()时使用翻转的值重命名)
  • pasteCommand(它将使用当前的FilePathCopyFile值,同样,此命令可能使用与重命名相同的类)

然后,您的撤消和重做操作只需在堆栈上调用undo()redo()即可。 请看一下这两个类的描述,看看如何实现所有这些。