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

时间:2018-01-18 09:47:00

标签: android qt qml

我正在使用QML开发应用程序,并且是使用QML的初学者。

我想点击“按我”按钮,然后打开一个文件管理器,然后选择一个文件夹。然后单击“确定”,列表视图将列出UI上该文件夹中的所有图像。但是,我的程序会立即在启动时显示一个没有单击任何按钮的文件。此外,“按我”按钮在点击时没有响应。列表视图甚至没有显示出来。有谁可以指出我的错误?

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 个答案:

答案 0 :(得分:0)

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