如何在qt5中使用它作为组件时访问元素“FileDialog”的fileUrl?

时间:2013-09-16 10:27:50

标签: qt qml

我制作了一个名为 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用作组件时如何获取它。

谢谢,

3 个答案:

答案 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之间现在有很多连接:

  • modality和nameFilters已修复
  • title,fileUrl,fileUrls在两个组件之间传递
  • 当FileDialog 接受拒绝时,MyFileDialog也将
  • 当您打开()或关闭()MyFileDialog时,内部FleDialog将打开或关闭

现在您拥有了自己的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 ++文件以使其被接受的问题。