【问题标题】: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
            }
        }
}

【问题讨论】:

    标签: qt qml qtquick2


    【解决方案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 元素(大小、顺序)。

      【讨论】:

        猜你喜欢
        • 2014-06-06
        • 1970-01-01
        • 2014-03-24
        • 1970-01-01
        • 1970-01-01
        • 2011-12-20
        • 2017-11-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多