0

我制作了一个名为fileDialog.qml的 qml 文件,它使用FileDialog{}了 qt5 提供的元素

http://qt-project.org/doc/qt-5.1/qtquickdialogs/qml-qtquick-dialogs1-filedialog.html

每当我需要资源的位置时,我想使用fileDialog.qml作为组件并设置所有属性,如标题、过滤器等。这些工作正常,但是当我尝试使用时id.fileUrl没有响应。详情如下。

文件 fileDialog.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
}

现在,当单击“浏览”(QML 中的一个项目用作按钮)按钮时,将其用作组件,然后我正在执行以下步骤。

onClicked: {

 //Default Values fileDialog.{selectExisting = true, selectFolder = false}
 fileDialog.title = "Add New Image"
 //fileDialog1.selectMultiple = true
 fileDialog.nameFilters = ["Image File (*.png *.jpg *.bmp)"]


 //fileDialog.fileUrls
 //string path

 fileDialog.visible = true
 console.log(" Image chosen: " + fileDialog.fileUrl + " in image")//---  (2)


}

第 (1) 行工作正常,但 (2) 行不通。控制台中 (2) 行的输出只是Image selected: in image

我不明白我在这里做错了什么,因为当我设置组件fileDialog的其他(如标题,文件管理器)属性时,它的工作但不适用于fileUrl或fileUrls。

请有人建议在将其用作组件时如何获取 fileUrl。

谢谢,

4

3 回答 3

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 之间有一堆连接:

  • 模态和名称过滤器是固定的
  • 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()
    }
}
于 2013-11-30T16:21:18.503 回答
1

试一试。从文档中,您可以看到fileUrl仅当您选择单个文件时才设置该属性。所以你期望它由你的设置是正确的FileDialog

问题是您尝试fileUrl在 FileDialog 关闭之前显示我认为。显示模式对话框可能不会阻止您的函数执行。

正如您在基本组件中所做的那样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);
    }
}
于 2013-09-16T10:56:18.043 回答
0

在阅读了@jbh 的答案后,我得到了一个解决方案,他的答案有助于在同一个 qml 文件中访问 FileDialog{} 元素之外的 fileUrl,但这不是我的问题的答案。

元素 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 插槽已被注释,我们使用接受的信号来访问 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++ 文件以使其被接受的问题。

于 2013-09-17T15:22:06.980 回答