Android 如何在QML(QT)中正确使用filedialog?
我正在开发一个使用QML的应用程序,我是一个使用QML的初学者 我想单击“按我”按钮,然后打开一个文件对话框,然后选择一个文件夹。单击“确定”后,列表视图将在UI上列出该文件夹中的所有图像。但是,我的程序在启动时会立即显示一个文件对话框,而无需单击任何按钮。此外,“按我”按钮在单击时不会给出响应。而listview甚至没有出现。有人能指出我的错误吗 main.qmlAndroid 如何在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
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。您能为我演示一个小示例吗?对不起,我没有这个示例的现成代码。你应该试着自己去做。如果您将面临麻烦,请创建新问题。