2012-03-09 25 views
7

Lo simple, pero no puede conseguirlo. Quiero un simple cuadro de selección desplegable con un par de selecciones. Al igual que en HTMLQt QML lista desplegable como en HTML

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

¿cuál es el código de QML para eso?

+4

Por extraño que pueda parecer, no hay ningún cuadro combinado "incorporado" en QML. Tienes que construirlo tú mismo usando otras primitivas. Sin embargo, hay muchos ejemplos. – Koying

+0

de hecho, muy extraño: S – Mathlight

Respuesta

14

Aquí está un ejemplo sencillo que tal vez podría ser utilizado como punto de partida:

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

tiene solo una cosa extraña, tengo un par de opciones (en este momento 5). Y cuando seleccioné la opción 3, ya no veo 1 y 2: S ¿qué tengo que cambiar? – Mathlight

+0

srr, no leí bien: P la línea que tuve que eliminar wass listView.currentIndex = index; del mousearea. Muchas gracias por el fragmento de código: P – Mathlight

+0

¿Cómo puedo acceder a selectedIndex desde fuera de archivo que contiene este código? –

7

Para los nuevos usuarios, hay una construida en ComboBox en Qt5.3 QtQuick.ControlsComboBox - Reference .

Ejemplo de Documentación:

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: que tenía que escribir como una respuesta, ya que el texto es demasiado largo para un comentario.

1

He estado usando enfoques con ComboBoxStyle (capacidades de personalización limitadas) y las implementaciones completamente personalizadas, pero tienen muchas limitaciones con la administración focus y la administración z-index.

Terminé con la implementación de ComboBox que consta de 2 partes: un encabezado que realmente coloca en algún lugar y un componente desplegable que crea dinámicamente. Este último consiste en un Item que cubre todo (e intercepta la actividad del mouse) y un menú desplegable que se coloca cuidadosamente debajo del encabezado.

Código es bastante masivo para incluirse aquí para que pueda ver los detalles in my blogpost with all the code

+0

Aunque es desvergonzado blog de publicidad Parece que has respondido mi pregunta. Ya no uso qt, así que no puedo probar tu código, pero parece prometedor. Sin embargo, creo que esto podría ayudar a alguien en el futuro con este problema. Por lo tanto, no marcaré su respuesta, porque tiene potencial ;-) – Mathlight

+0

@Mathlight El código de ejemplo es bastante grande para ser incluido aquí.La idea que puede resolver sus problemas se explica en mi respuesta, de modo que si uno tiene la habilidad QML puede comprender lo que escribí (sin ir a mi blog desvergonzadamente publicitado). – Ribtoks