ошибка инициализации ComboBox: невозможно прочитать свойство ‘конструктор’ из неопределенного

Когда я пытаюсь инициализировать модель ComboBox, выскакивает странная ошибка

test.pro

# Add more folders to ship with the application, here
folder_01.source = qml/androidTest
folder_01.target = qml
DEPLOYMENTFOLDERS = folder_01

#QMAKE_CXXFLAGS += -std=c++0x
CONFIG   += c++11
QT += qml quick

# The .cpp file which was generated for your project. Feel free to hack it.
SOURCES += main.cpp

OTHER_FILES += \
qml/androidTest/main.qml

main.cpp

#include <QtGui/QGuiApplication>
#include <QQuickView>

int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);

QQuickView view;
view.setSource(QUrl("/Users/Qt/program/experiment_apps_and_libs/test/qml/test/main.qml"));
view.show();

return app.exec();
}

main1.qml

import QtQuick 2.2
import QtQuick.Controls 1.1

Rectangle {
width: 100
height: 62

ListModel{
id: modelA
}

ComboBox{
model: modelA
}

Component.onCompleted: {
modelA.append({"source" : "hhhh"})
}
}

сообщение об ошибке

file: /// C: /Qt/Qt5.2.0/5.2.0/mingw48_32/qml/QtQuick/Controls/ComboBox.qml: 496: TypeError: Невозможно прочитать свойство ‘constructor’ из undefined

Как я мог исправить эту ошибку?

Изменить 1:

Я не делаю встроенную модель, потому что хочу разделить конструкцию модели и ComboBox. Трудно объяснить моим плохим английским, вот простой пример

TextCB

Column{
id: root

function appendUnitModel(units){
for(var i = 0; i != units.length; ++i){
unitModel.append({"unit": units[i]});
}
}

property alias inputText: input.text

SystemPalette{id: palette}

ListModel{
id: unitModel
}

Row{
spacing: 5

Text{
id: input

color: palette.highlight
height: root.height / 2
width: root.width * 0.6
focus: true
font.family: "Helvetica"font.pixelSize: 16; font.bold: true

//Behavior on height{ NumberAnimation{duration: 500} }

MouseArea{
anchors.fill: parent

onClicked: {
showKeyBoard()
}
}
}

ComboBox{
id: unitSelector

model: unitModel
editable: true
height: input.height
width: root.width - input.width
}
}
}

main2.qml

 TextCB{
id: inputAndClear

height: root.height * 0.2
width: root.width

Component.onCompleted: {
var units = ["meters", "decimeters", "centimeters",
"millimeters", "kilometers", "inches",
"feet", "yards", "miles", "nautical miles",
"cables"]

inputAndClear.appendUnitModel(units)
}

}

Разделив конструкцию модели и ComboBox, я мог бы использовать ее еще проще.

Изменить 2:
Для тех, кто не использует QtCreator, вот командная строка

  1. /Users/yyyy/Qt5.2.0/5.2.0/clang_64/bin/qmake -makefile -d test.pro
  2. делать
  3. cd androidTest.app/Contents/MacOS
  4. тест лдб
  5. бежать

Эти команды находятся под OSX, вам может понадобиться немного настроить его под другую ОС (например: изменить lldb на gdb)

1

Решение

Проблема в том, что вы пытаетесь установить свойство «source» для ListElement из ListModel а не «текст», что он ожидает. Соответственно, если вы измените следующую строку:

modelA.append({"source" : "hhhh"})

чтобы:

modelA.append({"text" : "hhhh"})

это будет работать. В качестве альтернативы, вы можете также добавить следующую строку в ваш ComboBox, чтобы получить свою роль, вступающую в силу:

ComboBox {
model: modelA
textRole: "source"}

Посмотрите код ComboBox для подробного объяснения этого:

// No text role set, check whether model has a suitable role
// If 'text' is found, or there's only one role, pick that.

У вас также есть другие незначительные проблемы в вашем коде, такие как жесткое программирование пути qml для Windows, как показано ниже. Вы можете просто перейти на «main.qml» или использовать систему ресурсов.

view.setSource(QUrl("/Users/Qt/program/experiment_apps_and_libs/test/qml/test/m‌​ain.qml"));

Я лично изменил это локально просто:

view.setSource(QUrl("m‌​ain.qml"));

Кроме того, у вас, кажется, есть ненужные опции qmake для этого эксперимента, настроенные следующим образом:

CONFIG += c++11

а также

QT += qml quick

Для последнего вам не нужно указывать qml в явном виде.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]