Раскрывающийся список Qt QML как в HTML - PullRequest
7 голосов
/ 09 марта 2012

Простая вещь, но не могу ее найти.Я хочу простой выпадающий список выбора с парой выборов.Как в HTML

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

что за код для QML для этого?

Ответы [ 5 ]

14 голосов
/ 09 марта 2012

Вот простой пример, который можно использовать в качестве отправной точки:

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 }
            }
        }
    }
7 голосов
/ 14 июля 2014

Для новых пользователей в Qt5.3 есть встроенный ComboBox QtQuick.Controls ComboBox - Ссылка .

Пример из документации:

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)
   }
 }
}

Примечание: я должен был опубликовать его как ответ, так как текст слишком длинный для комментария.

1 голос
/ 23 ноября 2017

Я использую подходы с ComboBoxStyle (возможности настройки ограничены) и полностью настраиваемые реализации, но у них есть много ограничений с управлением focus и z-index.

В итоге я реализовал ComboBox, который состоит из 2 частей: заголовка, который вы фактически помещаете куда-то, и выпадающего компонента, который вы создаете динамически. Последний состоит из Item, охватывающего все (и перехватывающего действия мыши), и выпадающего меню, которое аккуратно расположено под заголовком.

Код довольно массивный для включения сюда, так что вы можете увидеть подробности в моем посте со всем кодом

0 голосов
/ 11 марта 2012

Если вы ориентируетесь на Symbian, есть SelectionListItem и SelectionDialog: http://doc.qt.nokia.com/qt-components-symbian/qml-selectionlistitem.html

0 голосов
/ 10 марта 2012

Если вы ориентируетесь на устройства Nokia (Symbian или Meego), вы можете использовать высокоуровневые компоненты Qt Quick.Я считаю, что Menu является чем-то похожим на select.

в html. См. http://doc.qt.nokia.com/qt-components-symbian/qml-menu.html или http://harmattan -dev.nokia.com / docs / library / html / qt-components./qt-components-meego-menu.html

...