如何在最近打开的文件文件菜单中添加文件名
Posted
技术标签:
【中文标题】如何在最近打开的文件文件菜单中添加文件名【英文标题】:How to add File name at recently opened file File menu 【发布时间】:2015-10-03 19:32:54 【问题描述】:我想编写一个 QML 应用程序,将 FileDialog
中最新打开的文件添加到主菜单。我目前正在关注this 文档示例,但问题是我无法理解如何传递打开文件的文件名。
import QtQuick 2.3
import QtQuick.Controls 1.2
import QtQuick.Dialogs 1.0
ApplicationWindow
visible: true
width: 640
height: 480
title: qsTr("Hello World")
menuBar : MenuBar
Menu
id: recentFilesMenu
Instantiator
model: recentFilesMenu
MenuItem
text: model.fileName // I neeed to pass name of opned file here
onObjectAdded: recentFilesMenu.insertItem(index, object)
title: "File"
MenuItem
text: "Open"
onTriggered: fileDialog.visible = true
MenuItem
text: "Exit"
FileDialog
id: fileDialog
title: "Oooopen"
onAccepted:
// Here is problem
recentFilesMenu.objectName = fileDialog.fileUrls
【问题讨论】:
【参考方案1】:根据文档,Instantiator
接受最常见的模型类型 - C++ 和 QML 模型。在文档示例中,缺少此类信息,可能是为了不强制使用特定信息。实际实现可以在ListModel
上进行中继。在这种情况下,模型将公开一个用作实际菜单项的fileName
角色。
按照这种方法,结果将类似于以下代码。请注意,url
s 前面带有可以轻松删除的信息(例如,请参阅 this answer)。
import QtQuick 2.3
import QtQuick.Controls 1.2
import QtQuick.Dialogs 1.0
ApplicationWindow
visible: true
width: 640
height: 480
title: qsTr("Hello World")
menuBar : MenuBar
Menu
id: recentFilesMenu
title: "File"
MenuItem
text: "Open"
onTriggered: fileDialog.visible = true
MenuSeparator
Instantiator
model: ListModel id: files
MenuItem text: fileName
onObjectAdded: recentFilesMenu.insertItem(index, object)
onObjectRemoved: recentFilesMenu.removeItem(object)
MenuSeparator visible: files.count > 0
MenuItem text: "Exit"
FileDialog
id: fileDialog
title: "Open"
onAccepted:
for(var i = 0; i < fileDialog.fileUrls.length; ++i)
files.append(fileName: fileDialog.fileUrls[i])
【讨论】:
这应该是公认的答案。我正在使用组件执行此操作并执行 createObject 并将对象添加到我正在使用的菜单中。使用 Instantiator 的过程要干净得多。【参考方案2】:这种功能有一个小部件版本:
http://doc.qt.io/qt-5/qtwidgets-mainwindows-recentfiles-example.html
但是描述性帮助是不存在的。查看这里的代码:
http://doc.qt.io/qt-5/qtwidgets-mainwindows-recentfiles-mainwindow-cpp.html
你会看到它在 QSettings 中存储了最近文件列表的 QStringList,并将所有内容加载到 QActions 数组中。
在 mainWindow.cpp 中查看所有对
的引用enum MaxRecentFiles = 5 ;
QAction *recentFileActs[MaxRecentFiles];
你应该对如何在 QML 中做类似的事情有一些好的想法。
希望对您有所帮助。
【讨论】:
【参考方案3】:您可能有有限数量的最近要显示的文件。话虽如此,您可以实现 x 个 MenuItems 并将文本设置为 QStringList[i] 在 C++ 类中实现为 Q_PROPERTY。然后,您可以在 C++ 类上操作 QStringList 元素(大小、顺序)。
【讨论】:
以上是关于如何在最近打开的文件文件菜单中添加文件名的主要内容,如果未能解决你的问题,请参考以下文章