2016-12-14 94 views
0

我在网上的一个例子来填充组合框,但它并没有为我炒作,我不知道为什么!我有两个类stockDbCon,stock有三个私有字段以及公共访问器和增变器。 DbCon有一个Q_Property和两个公共函数,一个返回数据库连接,另一个创建并返回stock列表为QList<QObject*>。在main.cpp中,我创建了一个名为“data”的上下文属性,以便从QML访问DbCon从QList填充组合框<QObject*>

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(); 
}; 

.... 
ComboBox{ 
     model: data.stockModel 
     textRole: "code" 
} 
.... 

在main.cpp中

DbCon db; 
engine.rootContext()->setContextProperty("data", &db); 
engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); 

在实施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 ::数据

我没有得到任何东西在组合框!

如果我以这种方式

engine.rootContext()->setContextProperty("myModel", QVariant::fromValue(data)); 

创建main.cpp另一个上下文属性和设置myModel为模型的组合框,它工作正常。但我想这样做,因为onCurrentIndexChanged我将调用另一个函数,返回另一个QList<QObject*>为另一个qml文件TableView


编辑: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" 
      } 
     } 
    } 
} 

通过main.qml改变main.cppdatadataStoredata.stockModeldataStore.stockModel我获得以下错误

文件:/// C :/Qt/Qt5.7.0/5.7/mingw53_32/qml/QtQuick/Controls.2 /组合框。QML:62:15:无法为[未定义]分配到QString的

+0

什么是QML中的'数据'?它是如何定义的? – AlexanderVX

+0

@AlexanderVX它不是指向'DbCon'的指针吗?它在'main.cpp'中定义,如“main.cpp”部分所示。 –

+0

更好地显示整个QML部分。 – AlexanderVX

回答

1

你有两个问题:

  1. stockModel属性应该是NOTIFYable,这意味着你应该定义与例如财产Q_PROPERTY(QList<QObject*> stockModel READ stockModel NOTIFY stockModelChanged)并在DbCon类中提供void stockModelChanged(const QList<QObject *> &)信号。
  2. stock::name()也必须是属性,所以您需要声明Q_PROPERTY(QString name READ name NOTIFY nameChanged)并在stock类中也提供void nameChanged(const QString &)信号。
+0

如果我不参数化'stockModelChanged'和'nameChanged',它也可以。在这种情况下,我可以使用'nameChanged()'而不是'nameChanged(const QString&)'。是否有任何情况下我无法避免函数中的参数发信号? –

+1

取决于信号将连接的功能。信号'nameChanged(const QString&)'既可以连接到一个带有'const QString&'参数的函数,也可以连接到一个根本不带任何参数的函数。看起来QML对信号本身的价值不感兴趣,但使用getter来检索它。 – E4z9

+0

可能qml需要发射信号在某处调用getter @ E4z9。在'name'的setter中,我通过编写'emit nameChanged()'来提供这个功能 –