0

fileDialog.qml という名前のqmlファイルを作成し、qt5FileDialog{}から利用可能な要素を使用します

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 コンポーネントを作成することだと思います。

まず、MyFileDialog.qml に保存されているこのコンポーネントを「MyFileFialog」と呼びましょう。

// 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、fileUrl は両方のコンポーネント間で渡されます
  • FileDialog が承認または拒否されると、MyFileDialog も同様になります。
  • MyFileDialog を open() または close() すると、内側の 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 に答える
0

同じqmlファイルのFileDialog{}要素外のfileUrlにアクセスするのに役立つ@jbhの回答を読んだ後、解決策を得ましたが、それは私の質問に対する回答ではありません。

要素 FileDialog{} にはシグナルが受け入れられるため、このシグナルを使用してメソッドに接続し、fileUrl または Url にアクセスします。これは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 スロットはコメント化されており、accepted シグナルを使用して 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 に答える