Я следовал примеру в Интернете, чтобы заполнить combobox, но для меня это не было, и я не знаю почему !. У меня есть два класса stock
и DbCon
, stock
имеет три частных поля вместе с общедоступным аксессуаром и мутаторами. DbCon
имеет Q_Property
и две общедоступные функции, одна возвращает соединение с базой данных, а другая создает и возвращает stock
список как QList<QObject*>
. В main.cpp
Я создал контекстное свойство с именем «данные» для доступа DbCon
от QML
.Populate ComboBox от QList <QObject*>
в main.qml
У меня есть
....
ComboBox{
model: data.stockModel
textRole: "code"
}
....
в main.cpp
DbCon db;
engine.rootContext()->setContextProperty("data", &db);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
в dbcon.h
class DbCon:public QObject
{
Q_OBJECT
Q_PROPERTY(QList<QObject*> stockModel READ stockModel)
public:
explicit DbCon(QObject *parent = 0);
QSqlDatabase db();
QList<QObject*> stockModel();
};
в реализации QList<QObject*> stockModel()
из dbcon.h
QList<QObject*> data;
....
while (query.next()) {
stock *s = new stock();
....
data.append(s);
}
return data;
и stock.h
class stock : public QObject
{
Q_OBJECT
private:
QString m_name;
QString m_code;
int m_id;
public:
explicit stock(QObject *parent = 0);
QString name();
void setname(QString &name);
QString code();
void setcode(QString &code);
int id();
void setid(int &id);
};
При запуске приложения я получаю следующее сообщение в выходе приложения
QQmlExpression: Expression QRC: /main.qml: 16: 20 зависит на не NOTIFYable свойства: QQuickComboBox :: данные
и я не получаю ничего в выпадающем списке!
Если я создаю другую контекстную недвижимость в main.cpp
таким образом
engine.rootContext()->setContextProperty("myModel", QVariant::fromValue(data));
и установить myModel
в качестве модели для выпадающего списка, он отлично работает. Но я хочу сделать это таким образом, потому что onCurrentIndexChanged
Я вышлю другую функцию, которая возвращает другой QList<QObject*>
для TableView
другого файла qml
.
EDIT: Entrie QML
import QtQuick 2.5
import QtQuick.Window 2.2
import QtQuick.Controls 2.0
Window {
visible: true
width:600
height:600
property string contentSource
Column{
spacing:10
ComboBox{
model: data.stockModel
textRole: "code"
}
Loader {
id: content
width: parent.width
height:400
}
Row{
spacing:10
Button{
text: "Page1"
onClicked: content.source = "Page1.qml"
}
Button{
text: "Page2"
onClicked: content.source = "Page2.qml"
}
}
}
}
Изменяя data
к dataStore
в main.cpp
и data.stockModel
к dataStore.stockModel
в main.qml
я получаю следующее сообщение об ошибке
файла: /// C : /Qt/Qt5.7.0/5.7/mingw53_32/qml/QtQuick/Controls.2 /Поле со списком.QML: 62: 15: Невозможно назначить [неопределенными] для QString
Что такое «данные» в QML? Как это определено? – AlexanderVX
@AlexanderVX это не указатель на 'DbCon'? Он определен в 'main.cpp', как показано в разделе« в main.cpp ». –
Лучше показать всю часть QML. – AlexanderVX