使用 FileDialog 时在 QML 中循环

Posted

技术标签:

【中文标题】使用 FileDialog 时在 QML 中循环【英文标题】:Loop in QML when using FileDialog 【发布时间】:2018-08-03 11:30:47 【问题描述】:

我的循环有问题。我正在尝试从浏览器文件加载 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 将被调用。

有人帮帮我吗?

【问题讨论】:

您的问题缺少您遇到的实际问题。 【参考方案1】:

问题在于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")
           

    

【讨论】:

这里有一个新问题。当我显示 img 时,它会旋转。请帮帮我好吗? 没看懂,能不能把旋转后的图发一下。你到底想做什么?

以上是关于使用 FileDialog 时在 QML 中循环的主要内容,如果未能解决你的问题,请参考以下文章

Qml中的FileDialog在Release中不起作用

QML 文件对话框(选择文件夹)

单击列时在 Qml TableView Header 中查找单击事件

QML:在 GridView 中加载图像

QQuickWindow在共享lib自动关闭时在QApplication中显示

如何从 PySide 访问 QML\QtQuick 控件?