Android 如何在QML(QT)中正确使用filedialog?

Android 如何在QML(QT)中正确使用filedialog?,android,qt,qml,Android,Qt,Qml,我正在开发一个使用QML的应用程序,我是一个使用QML的初学者 我想单击“按我”按钮,然后打开一个文件对话框,然后选择一个文件夹。单击“确定”后,列表视图将在UI上列出该文件夹中的所有图像。但是,我的程序在启动时会立即显示一个文件对话框,而无需单击任何按钮。此外,“按我”按钮在单击时不会给出响应。而listview甚至没有出现。有人能指出我的错误吗 main.qml import QtQuick 2.7 import QtQuick.Controls 2.0 import QtQuick.La

我正在开发一个使用QML的应用程序,我是一个使用QML的初学者

我想单击“按我”按钮,然后打开一个文件对话框,然后选择一个文件夹。单击“确定”后,列表视图将在UI上列出该文件夹中的所有图像。但是,我的程序在启动时会立即显示一个文件对话框,而无需单击任何按钮。此外,“按我”按钮在单击时不会给出响应。而listview甚至没有出现。有人能指出我的错误吗

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")
        }
    }


}
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);
    }
}
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")
        }
    }
}
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

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")
        }
    }


}
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);
    }
}
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")
        }
    }
}
Page1Form.ui.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")
        }
    }


}
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);
    }
}
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")
        }
    }
}

设置
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;
        }
    }
}

感谢您的解决方案!:)打扰一下您提供的代码无法在android平台上部署,因为android不提供本机文件对话框。您能为我指出一些编写类似对话框的方向吗?如果Android不提供本机对话框,您仍然可以自己创建它,例如,使用ListViews。您能为我演示一个小示例吗?对不起,我没有这个示例的现成代码。你应该试着自己去做。如果您将面临麻烦,请创建新问题。