我制作了一个名为 fileDialog.qml 的qml文件,该文件使用qt5提供的元素FileDialog{}
http://qt-project.org/doc/qt-5.1/qtquickdialogs/qml-qtquick-dialogs1-filedialog.html
每当我需要资源的位置我想使用 fileDialog.qml 作为组件并设置所有属性,如标题,过滤器等。这些工作正常,但当我尝试使用{{1然后没有回应。详情如下。
文件 fileDialog.qml 是
id.fileUrl
现在使用此作为组件时,单击浏览(QML中的项目,如按钮)按钮,然后我执行以下步骤。
import QtQuick 2.1
import QtQuick.Dialogs 1.0
FileDialog {
id: fileDialog
objectName: "fileBrowser"
title: "Add New Layer"
visible: false
property alias selectedFilename: fileDialog.fileUrls
onAccepted: {
console.log("You chose: " + fileDialog.fileUrls)//-------- (1)
}
onRejected: {
console.log("Canceled")
}
//Component.onCompleted: visible = true
}
第(1)行工作正常但是(2)不起作用。控制台中(2)行的输出只是图像选择:图像。
我不明白我在这里做错了什么,因为当我设置组件 fileDialog 的其他(如title,filer)属性时,它的工作正常,但不适用于fileUrl或fileUrls。
请有人建议在将fileUrl用作组件时如何获取它。
谢谢,
答案 0 :(得分:2)
我认为您要做的是创建一个符合您需求的特殊FileDialog组件。
首先,让我们将此组件称为“MyFileFialog”保存在MyFileDialog.qml中。
// MyFileDialog.qml
import QtQuick 2.0
import QtQuick.Dialogs 1.0
Item {
id: root
property alias title: qmlFileDialog.title
property alias fileUrl: qmlFileDialog.fileUrl
property alias fileUrls: qmlFileDialog.fileUrls
signal accepted()
signal rejected()
function open() { qmlFileDialog.open() }
function close() { qmlFileDialog.close() }
FileDialog {
id: qmlFileDialog
modality: Qt.WindowModal
nameFilters: ["Image File (*.png *.jpg *.bmp)"]
onAccepted: root.accepted()
onRejected: root.rejected()
}
}
MyFileDialog和FileFialog之间现在有很多连接:
现在您拥有了自己的MyFileDialog,可以使用它:
Button {
text: "open"
MyFileDialog {
id: saveFileDialog
title: qsTr("Save to ...")
onRejected: {
console.log("Canceled")
}
onAccepted: {
console.log("File selected: " + fileUrl)
}
}
onClicked: {
saveFileDialog.open()
}
}
答案 1 :(得分:1)
试一试。从documentation开始,您可以看到fileUrl
属性仅在您选择单个文件时设置。因此,您希望通过FileDialog
问题是,我想在FileDialog关闭之前尝试显示fileUrl
。
显示模态对话框可能不会阻止您的函数执行。
正如您在基本组件fileDialog.qml
中所做的那样,您可以在onAccepted
上设置处理程序。当您的处理程序被调用时,fileUrl
属性将可用。
修改强>
Browse {
id: browser
signal fileChosen
FileDialog {
id: fileDialog
//configure your fileDialog here
//...
//emit parent signal when done
onAccepted: browser.fileChosen();
}
onClicked: {
fileDialog.open();
}
onFileChosen: {
//fileUrl should be available here
console.log(fileDialog.fileUrl);
}
}
答案 2 :(得分:0)
我在阅读了@jbh的答案之后得到了一个解决方案,其答案有助于在同一个qml文件中访问FileDialog {}元素之外的fileUrl,但这不是我的问题的答案。
Element FileDialog {}接受了一个信号,因此我们使用此信号连接到某个方法,然后访问fileUrl或Urls。这是 fileBrowser.qml 的样子。
import QtQuick 2.1
import QtQuick.Dialogs 1.0
FileDialog {
id: fileDialog
objectName: "fileBrowser"
title: "Add New Layer"
visible: false
//property alias selectedFilename: fileDialog.fileUrls
// signal fileChosen
// onAccepted: {
// console.log("You chose: " + fileDialog.fileUrls)
// fileChosen();
// }
onRejected: {
console.log("Canceled")
}
//Component.onCompleted: visible = true
}
上面的onAccepted slot被注释,我们使用接受的信号来访问fileUrl。
这是在需要文件对话框时使用 fileBrowser.qml 作为组件时qml文件的外观。
Item{
id: popup
Rectangle{
id: browse button
// properties setting for construction a button such as width, color, mouse area, states, etc..
// the method where we can use the URLS
function dialogAccepted(){
fileDialog.accepted.disconnect(dialogAccepted)
filePath.text = Qt.resolvedUrl( fileDialog.fileUrl ).toString()// to set the text in text field
console.log("You Chose in elev: " + fileDialog.fileUrl)
//browseButtonClicked(checkBox.checked)
}
onClicked: {
//Default Values fileDialog.{selectExisting = true, selectFolder = false}
fileDialog.title = "Add New Image"
//fileDialog1.selectMultiple = true
fileDialog.nameFilters = ["Image File (*.png *.jpg *.bmp)"]
fileDialog.visible = true
fileDialog.accepted.connect(dialogAccepted)
}
}
}
嗯,这对我有用,但我仍然面临如何在选择多个文件时如何解析Url以及如何将其发送到c ++文件以使其被接受的问题。