首页 > 解决方案 > 使用 FileDialog 时在 QML 中循环

问题描述

我的循环有一些问题。我正在尝试从浏览器文件加载 img 并在 3 秒内将其他人显示为图像 - 幻灯片。我使用了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被调用。

有人帮我吗?

标签: qtqmlfiledialog

解决方案


问题在于while,我的值在时间触发之前达到了终点。

一种解决方案是在定时器到期时调用循环,即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")
           }

    }
}

推荐阅读