aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/imports/controls/ComboBox.qml2
-rw-r--r--src/imports/controls/material/ComboBox.qml2
-rw-r--r--src/imports/controls/universal/ComboBox.qml2
-rw-r--r--src/templates/qquickcombobox.cpp32
-rw-r--r--tests/auto/controls/data/tst_combobox.qml47
5 files changed, 79 insertions, 6 deletions
diff --git a/src/imports/controls/ComboBox.qml b/src/imports/controls/ComboBox.qml
index 5941bcf4..369cbfec 100644
--- a/src/imports/controls/ComboBox.qml
+++ b/src/imports/controls/ComboBox.qml
@@ -55,7 +55,7 @@ T.ComboBox {
//! [delegate]
delegate: ItemDelegate {
width: control.width
- text: control.textRole ? model[control.textRole] : modelData
+ text: control.textRole ? (Array.isArray(control.model) ? modelData[control.textRole] : model[control.textRole]) : modelData
checkable: true
autoExclusive: true
checked: control.currentIndex === index
diff --git a/src/imports/controls/material/ComboBox.qml b/src/imports/controls/material/ComboBox.qml
index 634b5ed4..b0e11dcf 100644
--- a/src/imports/controls/material/ComboBox.qml
+++ b/src/imports/controls/material/ComboBox.qml
@@ -55,7 +55,7 @@ T.ComboBox {
//! [delegate]
delegate: ItemDelegate {
width: control.width
- text: control.textRole ? model[control.textRole] : modelData
+ text: control.textRole ? (Array.isArray(control.model) ? modelData[control.textRole] : model[control.textRole]) : modelData
highlighted: control.highlightedIndex === index
pressed: highlighted && control.pressed
}
diff --git a/src/imports/controls/universal/ComboBox.qml b/src/imports/controls/universal/ComboBox.qml
index d4e687d0..10939796 100644
--- a/src/imports/controls/universal/ComboBox.qml
+++ b/src/imports/controls/universal/ComboBox.qml
@@ -57,7 +57,7 @@ T.ComboBox {
//! [delegate]
delegate: ItemDelegate {
width: control.width
- text: control.textRole ? model[control.textRole] : modelData
+ text: control.textRole ? (Array.isArray(control.model) ? modelData[control.textRole] : model[control.textRole]) : modelData
highlighted: control.highlightedIndex === index
pressed: highlighted && control.pressed
}
diff --git a/src/templates/qquickcombobox.cpp b/src/templates/qquickcombobox.cpp
index e3e02212..cee384e3 100644
--- a/src/templates/qquickcombobox.cpp
+++ b/src/templates/qquickcombobox.cpp
@@ -119,6 +119,36 @@ QT_BEGIN_NAMESPACE
\sa highlightedIndex
*/
+class QQuickComboBoxDelegateModel : public QQmlDelegateModel
+{
+public:
+ explicit QQuickComboBoxDelegateModel(QQuickComboBox *combo);
+ QString stringValue(int index, const QString &role) Q_DECL_OVERRIDE;
+
+private:
+ QQuickComboBox *combo;
+};
+
+QQuickComboBoxDelegateModel::QQuickComboBoxDelegateModel(QQuickComboBox *combo) :
+ QQmlDelegateModel(qmlContext(combo), combo), combo(combo)
+{
+}
+
+QString QQuickComboBoxDelegateModel::stringValue(int index, const QString &role)
+{
+ QVariant model = combo->model();
+ if (model.userType() == QMetaType::QVariantList) {
+ QVariant object = model.toList().value(index);
+ if (object.userType() == QMetaType::QVariantMap) {
+ QVariantMap data = object.toMap();
+ if (data.count() == 1 && role == QLatin1String("modelData"))
+ return data.first().toString();
+ return data.value(role).toString();
+ }
+ }
+ return QQmlDelegateModel::stringValue(index, role);
+}
+
class QQuickComboBoxPrivate : public QQuickControlPrivate
{
Q_DECLARE_PUBLIC(QQuickComboBox)
@@ -302,7 +332,7 @@ void QQuickComboBoxPrivate::createDelegateModel()
delegateModel = model.value<QQmlInstanceModel *>();
if (!delegateModel && model.isValid()) {
- QQmlDelegateModel *dataModel = new QQmlDelegateModel(qmlContext(q), q);
+ QQmlDelegateModel *dataModel = new QQuickComboBoxDelegateModel(q);
dataModel->setModel(model);
dataModel->setDelegate(delegate);
if (q->isComponentComplete())
diff --git a/tests/auto/controls/data/tst_combobox.qml b/tests/auto/controls/data/tst_combobox.qml
index d74c52aa..d4b36b17 100644
--- a/tests/auto/controls/data/tst_combobox.qml
+++ b/tests/auto/controls/data/tst_combobox.qml
@@ -137,6 +137,36 @@ TestCase {
control.destroy()
}
+ function test_objects() {
+ var control = comboBox.createObject(window.contentItem)
+ verify(control)
+
+ var items = [
+ { text: "Apple" },
+ { text: "Orange" },
+ { text: "Banana" }
+ ]
+
+ control.model = items
+ compare(control.model, items)
+
+ compare(control.count, 3)
+ compare(control.currentIndex, 0)
+ compare(control.currentText, "Apple")
+
+ control.currentIndex = 2
+ compare(control.currentIndex, 2)
+ compare(control.currentText, "Banana")
+
+ control.model = null
+ compare(control.model, null)
+ compare(control.count, 0)
+ compare(control.currentIndex, -1)
+ compare(control.currentText, "")
+
+ control.destroy()
+ }
+
function test_number() {
var control = comboBox.createObject(window.contentItem)
verify(control)
@@ -201,11 +231,24 @@ TestCase {
ListElement { name: "Banana"; color: "yellow" }
}
- function test_textRole() {
+ property var fruitarray: [
+ { name: "Apple", color: "red" },
+ { name: "Orange", color: "orange" },
+ { name: "Banana", color: "yellow" }
+ ]
+
+ function test_textRole_data() {
+ return [
+ { tag: "ListModel", model: fruitmodel },
+ { tag: "ObjectArray", model: fruitarray }
+ ]
+ }
+
+ function test_textRole(data) {
var control = comboBox.createObject(window.contentItem)
verify(control)
- control.model = fruitmodel
+ control.model = data.model
compare(control.count, 3)
compare(control.currentIndex, 0)
compare(control.currentText, "")