在Qt中复制,剪切,粘贴,重命名,撤消和重做
Copy, Cut, Paste, Rename, Undo and Redo in 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 中选择一个文件,然后对该文件尝试此操作。如何实施此类操作?
QFile 提供复制、删除、重命名和移动到垃圾箱功能,您可以使用它们来实现所需的文件操作。
要实现复制/剪切和粘贴操作,您可以将复制上的文件路径保存在某个变量以及布尔copyFile
(而不是移动(中,在粘贴操作中,您(可以(在执行QFile::copy()
后清除该变量
为了实现您的撤消/重做功能,Qt提供了QUndoStack。基本上,你为每个动作(复制、重命名等(创建 QUndoCommand,它们提供 undo(( 和 redo(( 函数。例如,复制操作对应于一个 QUndoCommand,该命令在 redo(( 上复制并在 undo(( 上删除副本。
所以最后你会得到一堆继承 QUndoCommand 的类:
- CopyCommand(将保存选定的文件路径以供以后粘贴,或在撤消时重置剪贴板(
- CutCommand(与CopyCommand相同,但
copyFile
设置为false,它们可能是与成员相同的类( - 重命名命令(将在 redo(( 上重命名,并在撤消((上使用翻转的值重命名(
- 粘贴命令(将使用当前
filePath
和copyFile
值,同样,此命令可能与重命名使用相同的类(
然后,您的撤消和重做操作只需在堆栈上调用undo()
和redo()
即可。查看这两个类描述,了解如何实现所有这些。
相关文章:
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 通过重命名C++中的符号来减小二进制大小
- 如何以与 API 兼容的方式重命名类成员?
- 如何在Visual Studio Code中重命名我的a.exe文件?
- 在Qt中复制,剪切,粘贴,重命名,撤消和重做
- 重命名 win32api 函数以进行混淆
- 将内容从第一个文件("constituencies")移动到第二个文件("temp")并在之后重命名时,我的文件被删除
- 如何在重命名函数 (c++) 中使用变量?
- 如何通过 boost::p ython 重命名构造函数的关键字参数
- 以编程方式防止重命名或删除文件,但仍使其可写
- C++:重命名dll和lib并链接
- 使用 stdio.h 重新定位和重命名文件C++
- C++ Qt5 QDir重命名返回错误
- C++提升 ptree 重命名键
- 如何检测哪些进程更改,重命名或创建文件?
- 禁用/重命名从主机环境导入"env"
- 录制后无法重命名 rosbag 文件
- 避免在统计数据和重命名之间进行TOCTOU(检查时间,使用时间)
- 将文件重命名为已存在的文件名
- 重命名两个目录中的文件名,如果它们之间的某些字符匹配 - 矢量下标超出范围