2012-03-09 18 views
7

Semplice, ma non riesci a trovarlo. Voglio una semplice casella di selezione a discesa con un paio di selezioni. Come in HTMLElenco a discesa Qt QML come in HTML

<select> 
<option>1</option> 
<option>2</option> 
</select> 

qual è il codice per QML per questo?

+4

Per quanto strano possa sembra, non v'è alcuna combobox "integrato" in QML. Devi costruirlo tu stesso usando altri primitivi. Ci sono molti esempi, però. – Koying

+0

davvero strano: S – Mathlight

risposta

14

Ecco un semplice esempio che potrebbe forse essere utilizzato come punto di partenza:

import QtQuick 1.0 

Rectangle { 
    width:400; 
    height: 400; 

    Rectangle { 
      id:comboBox 
      property variant items: ["Item 1", "Item 2", "Item 3"] 
      property alias selectedItem: chosenItemText.text; 
      property alias selectedIndex: listView.currentIndex; 
      signal comboClicked; 
      width: 100; 
      height: 30; 
      z: 100; 
      smooth:true; 

      Rectangle { 
       id:chosenItem 
       radius:4; 
       width:parent.width; 
       height:comboBox.height; 
       color: "lightsteelblue" 
       smooth:true; 
       Text { 
        anchors.top: parent.top; 
        anchors.left: parent.left; 
        anchors.margins: 8; 
        id:chosenItemText 
        text:comboBox.items[0]; 
        font.family: "Arial" 
        font.pointSize: 14; 
        smooth:true 
       } 

       MouseArea { 
        anchors.fill: parent; 
        onClicked: { 
         comboBox.state = comboBox.state==="dropDown"?"":"dropDown" 
        } 
       } 
      } 

      Rectangle { 
       id:dropDown 
       width:comboBox.width; 
       height:0; 
       clip:true; 
       radius:4; 
       anchors.top: chosenItem.bottom; 
       anchors.margins: 2; 
       color: "lightgray" 

       ListView { 
        id:listView 
        height:500; 
        model: comboBox.items 
        currentIndex: 0 
        delegate: Item{ 
         width:comboBox.width; 
         height: comboBox.height; 

         Text { 
          text: modelData 
          anchors.top: parent.top; 
          anchors.left: parent.left; 
          anchors.margins: 5; 

         } 
         MouseArea { 
          anchors.fill: parent; 
          onClicked: { 
           comboBox.state = "" 
           var prevSelection = chosenItemText.text 
           chosenItemText.text = modelData 
           if(chosenItemText.text != prevSelection){ 
            comboBox.comboClicked(); 
           } 
           listView.currentIndex = index; 
          } 
         } 
        } 
       } 
      } 

      Component { 
       id: highlight 
       Rectangle { 
        width:comboBox.width; 
        height:comboBox.height; 
        color: "red"; 
        radius: 4 
       } 
      } 

      states: State { 
       name: "dropDown"; 
       PropertyChanges { target: dropDown; height:40*comboBox.items.length } 
      } 

      transitions: Transition { 
       NumberAnimation { target: dropDown; properties: "height"; easing.type: Easing.OutExpo; duration: 1000 } 
      } 
     } 
    } 
+0

ha ottenuto solo una cosa strana, ho un paio di opzioni (al momento 5). E quando ho selezionato l'opzione 3, non vedo più 1 e 2: S cosa devo cambiare ???? – Mathlight

+0

srr, non ha letto bene: P la riga che ho dovuto rimuovere wass listView.currentIndex = index; della torta di maiale. Grazie mille per il codice: P – Mathlight

+0

Come posso accedere a SelectedIndex da file che contengono questo codice? –

7

Per i nuovi utenti, v'è una costruito in ComboBox in Qt5.3 QtQuick.ControlsComboBox - Reference .

Esempio da documentazione:

import QtQuick 2.2 
import QtQuick.Controls 1.2 

ComboBox { 
    id: combo 
    editable: true 
    model: ListModel { 
    id: model 
    ListElement { text: "Banana"; color: "Yellow" } 
    ListElement { text: "Apple"; color: "Green" } 
    ListElement { text: "Coconut"; color: "Brown" } 
} 
onAccepted: { 
    if (combo.find(currentText) === -1) { 
    model.append({text: editText}) 
    currentIndex = combo.find(editText) 
    } 
} 
} 

Nota: ho dovuto pubblicarlo come una risposta, dal momento che il testo è troppo lungo per un commento.

1

Sto usando approcci con ComboBoxStyle (capacità di personalizzazione limitati) e implementazioni completamente personalizzati, ma hanno un sacco di limitazioni con focus gestione e z-index gestione.

Mi sono ritrovato con l'implementazione di ComboBox che consiste di 2 parti: un'intestazione che viene effettivamente inserita da qualche parte e un componente a discesa creato in modo dinamico. Quest'ultimo è costituito da un Item che copre tutto (e intercetta l'attività del mouse) e un menu a discesa che viene accuratamente posizionato sotto l'intestazione.

codice è piuttosto massiccia a inclusi qui in modo da poter vedere i dettagli in my blogpost with all the code

+0

Anche se è un blog spudorato Sembra che tu abbia risposto alla mia domanda. Non sto più usando qt, quindi non posso testare il tuo codice, ma sembra promettente. Penso tuttavia che questo potrebbe aiutare qualcuno in futuro con questo problema. Pertanto non voglio segnalare la tua risposta, perché ha un potenziale ;-) – Mathlight

+0

@Mathlight Il codice di esempio è abbastanza grande da includere qui.L'idea che può risolvere i tuoi problemi è spiegata nella mia risposta, quindi se uno ha abilità QML puoi capire quello che ho scritto (senza andare al mio blog spudoratamente pubblicizzato). – Ribtoks