2016-12-14 96 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()'來提供這個功能 –