Qt 如何在最近打开的文件菜单中添加文件名

Qt 如何在最近打开的文件菜单中添加文件名,qt,qml,qtquick2,Qt,Qml,Qtquick2,我想编写一个QML应用程序,将FileDialog中最新打开的文件添加到主菜单中。我目前正在遵循文档示例,但问题是我无法理解如何传递已打开文件的文件名 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")

我想编写一个QML应用程序,将
FileDialog
中最新打开的文件添加到主菜单中。我目前正在遵循文档示例,但问题是我无法理解如何传递已打开文件的文件名

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
            }
        }
}

此类功能有一个小部件版本:

但描述帮助是不存在的。查看此处的代码:

您将看到,它在QSettings中存储了最近文件列表的QStringList,并将所有内容加载到qaction数组中

通过mainWindow.cpp查看对的所有引用

enum { MaxRecentFiles = 5 };
QAction *recentFileActs[MaxRecentFiles];
对于如何在QML中执行类似的操作,您应该有一些好的想法


<>希望帮助。

< P>根据文档,接受最常见的模型类型——C++和QML。在文档示例中,缺少此类信息,可能是为了不强制使用特定信息。实际的实现可以依赖于
ListModel
。在这种情况下,模型将公开用作实际菜单项的
文件名
角色

按照这种方法,结果类似于下面的代码。请注意,
url
s前面有可以轻松删除的信息(例如,请参阅)

导入QtQuick 2.3
导入QtQuick.Controls 1.2
导入QtQuick.Dialogs 1.0
应用程序窗口{
可见:正确
宽度:640
身高:480
标题:qsTr(“你好世界”)
菜单栏:菜单栏{
菜单{
id:recentFilesMenu
标题:“文件”
梅努伊特姆{
正文:“打开”
onTriggered:fileDialog.visible=true
}
菜单分隔符{}
实例化器{
模型:ListModel{id:files}
MenuItem{text:fileName}
onObjectAdded:recentFilesMenu.insertItem(索引,对象)
onObjectRemoved:recentFilesMenu.removeItem(对象)
}
MenuSeparator{visible:files.count>0}
MenuItem{text:“退出”}
}
}
文件对话框{
id:fileDialog
标题:“公开”
不接受:{
对于(var i=0;i
您可能有有限数量的最新文件要显示。也就是说,你可以实现X个数,并将文本设置为在C++类中实现为A的QSTRIGLIST[I]。然后,您可以在C++类上操作QSTRIGLIST元素(大小,顺序)。我用一个组件执行这个操作,执行createObject并将该对象添加到我正在使用的菜单中。使用实例化器是一个更干净的过程。
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]})
        }
    }
}