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

时间:2015-10-03 19:32:55

标签: qt qml qtquick2

我想编写一个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
            }
        }
}

3 个答案:

答案 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元素(大小,顺序)。