我想编写一个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
}
}
}
答案 0 :(得分:0)
这种功能有一个小部件版本:
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中做类似的事情有一些好的想法。
希望有所帮助。
答案 1 :(得分:0)
根据文档,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]})
}
}
}
答案 2 :(得分:0)
您可能希望显示有限数量的最近文件。话虽这么说,你可以实现x号MenuItems并将文本设置为在C ++类中实现为Q_PROPERTY的QStringList [i]。然后,您可以在C ++类上操作QStringList元素(大小,顺序)。