2016-07-26 25 views
1

Ich war bereit, FileDialog von QML zu verwenden, aber es stellt sich nicht für SaveAs Situationen (weil Sie nicht einen nicht vorhandenen Dateinamen angeben) und das Gefühl des Dialogs ist nicht wirklich modern oder Handy, Mobiltelefon.Benutzerdefinierte FileDialog in QML

Als Abhilfe Ich habe einen einfachen MyFileDialog zu bauen entschieden, die wie folgt aussieht:

import QtQuick 2.7 
import QtQuick.Controls 2.0 
import QtQuick.Controls.Styles 1.4 
import QtQuick.Controls.Material 2.0 
import QtQuick.Layouts 1.3 

Popup 
{ 
    implicitWidth: window.width/3 * 2 
    implicitHeight: window.height/3 * 2 
    x: (window.width - width)/2 
    y: 20 
    modal: true 
    focus: true 

    property alias title: popupLabel.text 

    contentItem: ColumnLayout 
    { 
     id: settingsColumn 
     spacing: 20 

     // Popup title. 
     Label 
     { 
      id: popupLabel 
      font.bold: true 
      anchors.horizontalCenter: parent.horizontalCenter 
     } 

     // File path. 
     TextField 
     { 
      id: field 
      placeholderText: "File path..." 
      implicitWidth: parent.width 
     } 

     // Buttons. 
     RowLayout 
     { 
      spacing: 10 

      Button 
      { 
       id: okButton 
       text: "Ok" 
       onClicked: { onOkClicked(); close();} 

       Material.foreground: Material.primary 
       Material.background: "transparent" 
       Material.elevation: 0 

       Layout.preferredWidth: 0 
       Layout.fillWidth: true 
      } 

      Button 
      { 
       id: cancelButton 
       text: "Cancel" 
       onClicked: { state = false; } 

       Material.background: "transparent" 
       Material.elevation: 0 

       Layout.preferredWidth: 0 
       Layout.fillWidth: true 
      } 
     } 
    } 
} 

Nun mag ich diesen Dialog für mehr Situationen wiederverwendbar sein möge, zum Beispiel um Dateien zu öffnen, Dateien zu importieren, um Dateien zu speichern ... Aber das bedeutet, dass das Verhalten von okButton.onClicked für jede dieser Situationen unterschiedlich ist.

Ich habe verschiedene Möglichkeiten versucht, um ein benutzerdefiniertes (oder veränderbares) Verhalten für okButton.onClicked anzugeben, aber bisher kein Glück. Hier ist, was ich versucht habe:

  1. Erstellen Sie eine Eigenschaft Alias ​​okButton.onClicked in Popup
  2. definieren okButton.onClicked, wo ich das Popup verwenden
  3. ein Verhalten Funktion außerhalb des Popup definieren und stelle es dem Popup zur Verfügung

Keiner dieser Versuche funktionierte und ich habe immer Kompilierungsfehler.

Irgendeine Idee von dem, was ich könnte meinen Code wiederverwendbar machen?

Auch ich konnte kein neues und sauberes Beispiel im Internet finden, irgendeine Idee wo ich das finden könnte?

Danke,

Antoine.

+1

Welche 'FileDialog' redest du da? [Dieser kann als speichern.] (Http://doc.qt.io/qt-5/qml-qtquick-dialogs-filedialog.html#selectExisting-prop) – Mitch

+0

@Mitch, du hast mir wirklich mehrere Stunden gerettet, danke! – arennuit

Antwort

3

FileDialog vom QtQuick.Dialogs Import hat eine selectExisting Eigenschaft, die Sie sparen können:

Ob nur vorhandene Dateien oder Verzeichnisse ausgewählt werden.

Standardmäßig ist diese Eigenschaft wahr. Diese Eigenschaft muss vor dem Öffnen des Dialogfelds auf den gewünschten Wert gesetzt werden. Wenn diese Eigenschaft auf "false" gesetzt wird, bedeutet dies, dass der Dialog dazu dient, eine Datei zu benennen, in der etwas gespeichert werden soll, oder einen Ordner zu benennen, der erstellt werden soll. Daher muss selectMultiple false sein.

Wenn Sie ein modernes mobiles Interface wünschen, sollten Sie es sich lieber selbst machen. Ich würde jedoch nicht mit einem Dialog gehen, da dies eher Desktop-orientiert ist. Dropbox, verwendet zum Beispiel so etwas wie ein ListView in seiner mobilen UI:

dropbox

+0

Ha ha! Das ist genau die Art von Ratschlägen, die ich erwartet habe!Ich werde den Dialog für die Prototyp-Version verwenden, aber sobald wir die Beta-Version erreicht haben, werden wir zu Ihrem Listview-, Dropbox-ähnlichen Vorschlag übergehen. Vielen Dank! – arennuit