2016-12-14 5 views
0

Я следовал примеру в Интернете, чтобы заполнить 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

+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) и обеспечить сигнал void stockModelChanged(const QList<QObject *> &) в классе DbCon.
  2. stock::name() также должен быть объект, поэтому вам необходимо объявить, что с Q_PROPERTY(QString name READ name NOTIFY nameChanged) и предоставить сигнал void nameChanged(const QString &) в классе stock.
+0

Он также работает, если я не параметризую 'stockModelChanged' и' nameChanged'. В этом случае я могу использовать 'nameChanged()' вместо 'nameChanged (const QString &)'. Есть ли случай, когда у меня нет способа избежать параметра в функции, которая сигнализирует? –

+1

Зависит от того, с какими функциями будет связан сигнал. Сигнал 'nameChanged (const QString &)' может быть связан как с функцией, принимающей параметр 'const QString & ', так и с функцией, которая вообще не принимает никаких параметров. Похоже, QML не интересуется значением в самом сигнале, но использует getter для его получения. – E4z9

+0

Возможно, qml требует, чтобы сигнал выходил где-то, чтобы вызвать getter @ E4z9. В установщике 'name' я предусмотрел, что написав' emit nameChanged() ' –

Смежные вопросы