使用 FileDialog 时在 QML 中循环

Loop in QML when using FileDialog

循环有问题。我正在尝试从 browserfile 加载 img 并在 3s 中将其他人显示为图像 - 幻灯片。我使用了 while 循环

FileDialog {
    id: fileDialog
    visible: false
    title: "Choose a file"
    property url defaultz: "E:\IMG"
    folder: defaultz
    selectMultiple: true
    nameFilters: [ "Image files (*.jpg *.png *.bmp)", "All files (*)" ]
    onAccepted: {
        console.log("You chose: " + fileDialog.fileUrls)
        console.log(fileDialog.fileUrls.length)
        click.visible = false
        //title.visible = false
        while(i<fileDialog.fileUrls.length){
            loop()
        }

    }

    onRejected: {
        console.log("Canceled")
        fileDialog.visible = false
        click.visible = false
    }

    Component.onCompleted: visible = false
}


Image {
    id: show
    visible: false
    x:0
    y:0
    width: 300
    height: 300
    Timer{
        id: tmr
        interval: 5000
        running: false
        repeat: false
        onTriggered: {
            show.visible = false
        }


    }
}
function loop(){
    show.source = fileDialog.fileUrls[i]
    show.visible = true
    tmr.running = true
    i++
}

调用loop()时,会运行show.source = fileDialog.fileUrls[i]停止。之后,将调用 show.visible = truetmr.running

有人帮帮我吗?

问题出在 while,i 值在时间触发前到达末尾。

一个解决方案是在计时器到期时调用循环,即 onTriggered 并在 loop 函数中显示所有选定图片后停止计时器。

import QtQuick 2.9
import QtQuick.Controls 2.2
import QtQuick.Window 2.2
import QtQuick.Dialogs 1.2

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")
    property int i:0

    FileDialog {
        id: fileDialog
        visible: false
        title: "Choose a file"
        property url defaultz: "E:\IMG"
        folder: defaultz
        selectMultiple: true
        nameFilters: [ "Image files (*.jpg *.png *.bmp)", "All files (*)" ]
        onAccepted: {
            console.log("You chose: " + fileDialog.fileUrls)
            console.log(fileDialog.fileUrls.length)
            //click.visible = false
            //title.visible = false
//            while(i<fileDialog.fileUrls.length){
//                loop()
//            }
            loop();      // show first picture immediately
            tmr.start(); // start timer after selection

        }

        onRejected: {
            console.log("Canceled")
            fileDialog.visible = false
            //click.visible = false
        }

        Component.onCompleted: {fileDialog.visible = true
        }
    }


    Image {
        id: show
        visible: false
        x:0
        y:0
        width: 300
        height: 300
        Timer{
            id: tmr
            interval: 5000
            running: false
            repeat: true
            onTriggered: {
                show.visible = false
                show.visible = false
                            i++
                            loop()
                            console.log("triggered: " + i)
            }


        }
    }
    function loop(){
        if(i<fileDialog.fileUrls.length)
           {
           show.source = fileDialog.fileUrls[i]
           console.log("showing: " + i + " " + fileDialog.fileUrls[i])
           show.visible = true

           }else
           {
               tmr.stop();  // stop the timer
               console.log("stopped")
           }

    }
}