从文件夹加载所有 QML

Load all QML's from folder

是否可以将所有 QML 从工作目录子文件夹加载到 SwipeView?这些 QML 的数量是未知的,并且会及时更改(用户可能会添加新的和删除旧的),所以我认为我还需要在单击某些 Button 时重新加载(刷新)SwipeView。所有 QML 都是不同的,因为它们是根据用户提供的信息在 Python 后端创建的(只是模板相同)。

我做了这样的事情:

SwipeView {
        id: job_swipe
        width: jobwindow.width/2
        height: jobwindow.height/2
        anchors.verticalCenter: parent.verticalCenter
        anchors.horizontalCenter: parent.horizontalCenter
        orientation: Qt.Vertical

        Component.onCompleted:
            function load_jobs() {
                jobsignals.jobs_to_qmls_slot()
                var i
                var fn
                var fc = (jobsignals.filecount)
                for (i = 0; i<fc; i++) {
                    fn = "jobs/job" + i + ".qml";
                    job_swipe.addPage(job_swipe.createPage(fn))
                }
                //job_swipe.currentIndex = (fc-1)
            }


        function addPage(page) {
            addItem(page)
            page.visible = true
        }

        function createPage(jobfile){
            var component = Qt.createComponent(jobfile);
            var page = component.createObject(job_swipe);
            return page
        }

        function removePage(page) {
            removeItem(page)
            page.visible = false
        }
    }

但是删除页面并没有像我想要的那样工作 - 它在视觉上删除了页面,但对象仍然存在,所以当我想添加新页面时,它首先创建我已经删除的页面

我会使用 FolderListModel 生成一个文件夹中的 .qml 文件列表。然后你可以用加载器加载它们。

SwipeView {
    Repeater {
        model: FolderListModel {
            id: folderModel

            folder: // Whatever folder you want to search

            nameFilters: ["*.qml"]
        }

        Loader {
            source: fileUrl
        }
   }
}

编辑:

要刷新数据,很遗憾,我在 FolderListModel 中没有看到用于执行此操作的内置方法。但是您应该能够重置文件夹值(以一种丑陋的方式),如下所示:

Button {
    text: "Refresh"
    onClicked: {
        var currentFolder = folderModel.folder
        folderModel.folder = ""                // First clear the folder
        folderModel.folder = currentFolder;    // Then set the folder again
    }
}