如何在QML(QT)中正确使用文件对话框?

3
我正在使用QML开发一个应用程序,并且是QML的初学者。
我想点击“Press me”按钮,然后打开一个文件对话框并选择一个文件夹。然后单击“确定”后,列表视图将在UI上列出该文件夹中的所有图像。然而,我的程序在启动时立即显示文件对话框,而没有点击任何按钮。此外,“Press me”按钮在单击时没有反应。列表视图甚至没有显示出来。有人能指出我的错误吗?

enter image description here

main.qml

import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.3
import QtQuick.Window 2.1
import QtQuick.Controls.Styles 1.2
import QtQuick.Dialogs 1.1
import Qt.labs.folderlistmodel 2.1

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    SwipeView {
        id: swipeView
        anchors.fill: parent
        currentIndex: tabBar.currentIndex

        Page1 {
        }

        Page {
            Label {
                text: qsTr("Second page")
                anchors.centerIn: parent
            }
        }
    }

    footer: TabBar {
        id: tabBar
        currentIndex: swipeView.currentIndex
        TabButton {
            text: qsTr("First")
        }
        TabButton {
            text: qsTr("Second")
        }
    }


}

Page1.qml

import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.3
import QtQuick.Window 2.1
import QtQuick.Controls.Styles 1.2
import QtQuick.Dialogs 1.1
import Qt.labs.folderlistmodel 2.1

Page1Form {
    FolderListModel
    {
        id: folderModel
        showDirs: true
        showDirsFirst: true
        folder: fileDialog.fileUrl
        nameFilters: ["Image Files (*.jpg *.png *.gif)"];
    //nameFilters: ["*.jpg"]
    }

    Component {
        id: fileDelegate
        Text { text: fileName }
    }

    ListView {
        anchors.fill: parent
        model: folderModel
        delegate: fileDelegate
    }

    FileDialog{
        id: fileDialog;
        title: "Please choose a file";
        nameFilters: ["Image Files (*.jpg *.png *.gif)"];
        selectFolder:true
        visible: true
        onAccepted: {
            console.log("User has selected " + dialogFile.folder);
            fileDialog.close()
        }
    }

    button1.onClicked: {
        fileDialog.open();
        console.log("Button Pressed. Entered text: " + textField1.text);
    }
}

Page1Form.ui.qml

import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.3

Item {
    property alias textField1: textField1
    property alias button1: button1

    RowLayout {
        anchors.horizontalCenter: parent.horizontalCenter
        anchors.topMargin: 20
        anchors.top: parent.top

        TextField {
            id: textField1
            placeholderText: qsTr("Text Field")
        }

        Button {
            id: button1
            text: qsTr("Press Me")
        }
    }
}
1个回答

2

设置 Dialog.visible: true 相当于调用 Dialog.open()。只需删除此行即可。 以下是一个示例代码,用于显示所选文件夹,以防您觉得有用:

import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.2
import Qt.labs.folderlistmodel 2.1
import Qt.labs.platform 1.0

Window {
    id: window
    title: "Folder dialog test"
    visible: true
    width: 600
    height: 400

    ColumnLayout {
        anchors.fill: parent
        anchors.margins: 10
        RowLayout {
            Layout.preferredHeight: 40
            Layout.fillWidth: true
            TextField {
                id: path
                enabled: false
                text: folderModel.folder
                Layout.fillWidth: true
            }
            Button {
                text: "..."
                onClicked: folderDialog.open();
            }
        }

        ListView {
            Layout.fillHeight: true
            Layout.fillWidth: true
            model: FolderListModel {
                id: folderModel
                folder: ""
            }
            delegate: Text { text: fileName }
        }
    }

    FolderDialog {
        id: folderDialog
        currentFolder: ""
        folder: StandardPaths.standardLocations(StandardPaths.PicturesLocation)[0]
        onFolderChanged: {
            folderModel.folder = folder;
        }
    }
}

感谢你的解决方案!:) - md612
不好意思。您提供的代码无法在Android平台上部署,因为Android不提供原生文件对话框。能否指出一些方向让我编写类似的代码呢? - md612
如果Android没有提供本地对话框,您仍然可以使用例如ListView自己创建它。 - folibis
你能为我演示一个小例子吗? - md612
抱歉,我没有针对这种情况的现成代码。你应该尝试自己解决。如果遇到问题,请创建一个新的问题。 - folibis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接