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

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 角色。

按照这种方法,结果将类似于以下代码。请注意,urls 前面带有可以轻松删除的信息(例如,请参阅 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 元素(大小、顺序)。

【讨论】:

以上是关于如何在最近打开的文件文件菜单中添加文件名的主要内容,如果未能解决你的问题,请参考以下文章

C#如何实现动态添加右键菜单

快速访问的内容出现在了桌面上如何去掉?

小工具在新文件夹中打开快捷方式所指向的文件

windows7如何在右键新建菜单里添加excel2007怎么添加呀

Win10关闭最近使用文件夹清理使用痕迹

如何在MFC应用程序中添加文档菜单?