繁体   English   中英

Qt 中的复制、剪切、粘贴、重命名、撤消和重做

[英]Copy, Cut, Paste, Rename, Undo and Redo in Qt

我有一个 window,它有两个小部件,分别是 QTreeView 和 QListView。 我 select 在 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&)));
}

另外,当我将鼠标 hover 放在 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 中 select 一个文件,然后在该文件上尝试此操作。 我怎样才能实施这样的行动?

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

要实现复制/剪切和粘贴操作,您可以将复制时的文件路径保存在某个变量以及 bool copyFile (而不是移动),并在粘贴操作中(可以)在执行QFile::copy()

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

所以最后你会得到一堆继承 QUndoCommand 的类:

  • CopyCommand(将保存选定的文件路径以供以后粘贴,或在撤消时重置剪贴板)
  • CutCommand(与 CopyCommand 相同,但将copyFile设置为 false,这些可能与成员相同的 class)
  • RenameCommand(将在 redo() 上重命名并在 undo() 上使用翻转值重命名)
  • PasteCommand(将使用当前的filePathcopyFile值,同样,此命令可能使用与重命名相同的 class)

然后,您的撤消和重做操作只需在堆栈上调用undo()redo() 查看 class 描述,了解如何实现所有这些。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM