从QList <qobject *>填充ComboBox

时间:2016-12-14 18:46:58

标签: qt qml

我在网上关注一个例子来填充组合框,但它并没有为我而烦恼,我不知道为什么!我有两个课程stockDbConstock有三个私有字段以及公共访问者和变更者。 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

1 个答案:

答案 0 :(得分:1)

您有两个问题:

  1. 您的stockModel属性应该是NOTIFYable,这意味着您应该使用例如Q_PROPERTY(QList<QObject*> stockModel READ stockModel NOTIFY stockModelChanged)并在void stockModelChanged(const QList<QObject *> &)类中提供DbCon信号。
  2. stock::name()也必须是属性,因此您需要使用Q_PROPERTY(QString name READ name NOTIFY nameChanged)声明该属性,并在void nameChanged(const QString &)类中提供stock信号。