我在网上关注一个例子来填充组合框,但它并没有为我而烦恼,我不知道为什么!我有两个课程stock
和DbCon
,stock
有三个私有字段以及公共访问者和变更者。 DbCon
有一个Q_Property
和两个公共函数,一个返回一个数据库连接,另一个创建并返回stock
列表为QList<QObject*>
。在main.cpp
中,我创建了一个名为&#34; data&#34;的上下文属性。从DbCon
访问QML
。
在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:表达式qrc:/main.qml:16:20取决于非NOTIFYable属性: QQuickComboBox ::数据
我在组合框中没有得到任何东西!
如果我以这种方式在main.cpp
中创建另一个上下文属性
engine.rootContext()->setContextProperty("myModel", QVariant::fromValue(data));
并将myModel
设置为组合框的模型,它可以正常工作。但我希望以这种方式执行此操作,因为onCurrentIndexChanged
我将调用另一个函数,为另一个QList<QObject*>
文件的TableView
返回另一个qml
。
编辑: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
,我会收到以下错误
file:/// C:/Qt/Qt5.7.0/5.7/mingw53_32/qml/QtQuick/Controls.2/ComboBox.qml:62:15:无法将[undefined]指定给QString
答案 0 :(得分:1)
您有两个问题:
stockModel
属性应该是NOTIFYable,这意味着您应该使用例如Q_PROPERTY(QList<QObject*> stockModel READ stockModel NOTIFY stockModelChanged)
并在void stockModelChanged(const QList<QObject *> &)
类中提供DbCon
信号。stock::name()
也必须是属性,因此您需要使用Q_PROPERTY(QString name READ name NOTIFY nameChanged)
声明该属性,并在void nameChanged(const QString &)
类中提供stock
信号。