model - QML Combobox reports ReferenceError: modelData is not defined -
i have following simple qml combobox:
import qtquick 2.0 import qtquick.controls 1.4 import si.mikroelektronika 1.0 item { id: uestaffselector width: 256 height: 96 combobox { model: uepeoplemodel editable: false anchors.fill: parent } // combobox } // item
as can see, assign uepeoplemodel
it, working ok in app. once app executed, following qml runtime errors:
file:///opt/qtopensource55/5.5/gcc_64/qml/qtquick/controls/combobox.qml:562: referenceerror: modeldata not defined file:///opt/qtopensource55/5.5/gcc_64/qml/qtquick/controls/combobox.qml:562: referenceerror: modeldata not defined file:///opt/qtopensource55/5.5/gcc_64/qml/qtquick/controls/combobox.qml:562: referenceerror: modeldata not defined file:///opt/qtopensource55/5.5/gcc_64/qml/qtquick/controls/combobox.qml:562: referenceerror: modeldata not defined file:///opt/qtopensource55/5.5/gcc_64/qml/qtquick/controls/combobox.qml:562: referenceerror: modeldata not defined
whole application constructed in main.cpp:
#include <qtqml> #include <qapplication> #include <qqmlapplicationengine> #include <qtimer> #include "database/uepeoplemodel.h" #include "core/ueapplicationstatus.h" #include "core/uedatabaseconnectionstatus.h" #include "core/uebluetoothmanager.h" #include "core/uebluetoothprinterconnectionstatus.h" int main(int argc, char *argv[]) { qapplication app(argc, argv); qqmlapplicationengine engine; ueapplicationstatus* ueapplicationstatus=new ueapplicationstatus(qapp); uepeoplemodel* uepeoplemodel=new uepeoplemodel(qapp); uebluetoothmanager* uebtmanager=new uebluetoothmanager(qapp); qobject::connect(uepeoplemodel, signal(uesignaldatabaseconnectionchanged(uedatabaseconnectionstatus::uetypedatabaseconnectionstatus)), ueapplicationstatus, slot(ueslotdatabaseconnectionchanged(uedatabaseconnectionstatus::uetypedatabaseconnectionstatus))); qobject::connect(uebtmanager, signal(uesignalbtprinterconnectionchanged(uebluetoothprinterconnectionstatus::uetypebluetootprinterconnectionstatus)), ueapplicationstatus, slot(ueslotbtprinterconnectionchanged(uebluetoothprinterconnectionstatus::uetypebluetootprinterconnectionstatus))); engine.rootcontext()->setcontextproperty("uepeoplemodel", uepeoplemodel); engine.rootcontext()->setcontextproperty("ueapplicationstatus", ueapplicationstatus); engine.rootcontext()->setcontextproperty("uebtmanager", uebtmanager); engine.addimageprovider(qlatin1string("uepeoplemodel"), uepeoplemodel); qmlregisteruncreatabletype<uedatabaseconnectionstatus>("si.mikroelektronika", 1, 0, "uetypedatabaseconnectionstatus", "database connection status"); qmlregisteruncreatabletype<uebluetoothprinterconnectionstatus>("si.mikroelektronika", 1, 0, "uetypebluetootprinterconnectionstatus", "bluetooth printer connection status"); engine.load(qurl(qstringliteral("qrc:/main.qml"))); uepeoplemodel->ueconnecttodatabase(); uebtmanager->uestartpairing(); //ueapplicationstatus->ueupdate(uepeoplemodel->uefetchusers()); return app.exec(); }
here uepeoplemodel
header, file uepeoplemodel.h:
#ifndef uepeoplemodel_h #define uepeoplemodel_h #include <qimage> #include <qvariant> #include <qstringlist> #include <qhash> #include <qbytearray> #include <qsqlerror> #include <qsqlquerymodel> #include <qsqlrecord> #include <qmodelindex> #include <qquickimageprovider> #include <qbytearray> #include <qsqlrecord> #include <qsqlquery> #include "../settings/uedefaults.h" #include "../core/uedatabaseconnectionstatus.h" #include "../core/uetypes.h" #include "../core/ueapplicationstatus.h" #include "../core/ueuserrecord.h" class uepeoplemodel : public qsqlquerymodel, public qquickimageprovider { q_object private: qsqldatabase m_uedb; private: qsqldatabase uedatabase() const { return this->m_uedb; } void uesetdatabase(const qsqldatabase& database) { this->m_uedb=database; } qimage ueimage(const qstring& id) const; public: uepeoplemodel(qobject *parent=0); ~uepeoplemodel(); qvariant data(const qmodelindex &index, int role) const q_decl_override; qimage requestimage(const qstring &id, qsize *size, const qsize &requestedsize); uetyperoles rolenames() const; void ueconnecttodatabase(); uetypeusers* uefetchusers(); public: static const int uerolename=qt::userrole+1; static const int ueroleimage=qt::userrole+2; static const int uerolepassword=qt::userrole+3; signals: void uesignaldatabaseconnectionchanged(const uedatabaseconnectionstatus::uetypedatabaseconnectionstatus& newstatus); }; #endif // uepeoplemodel_h
and implementation, file uepeoplemodel.cpp:
#include "uepeoplemodel.h" uepeoplemodel::uepeoplemodel(qobject* parent) : qsqlquerymodel(parent), qquickimageprovider(qqmlimageproviderbase::image, qqmlimageproviderbase::forceasynchronousimageloading) { emit this->uesignaldatabaseconnectionchanged(uedatabaseconnectionstatus::not_connected); } // default constructor uepeoplemodel::~uepeoplemodel() { qstring connname=this->uedatabase().connectionname(); this->uedatabase().close(); this->uesetdatabase(qsqldatabase()); this->uedatabase().removedatabase(connname); emit this->uesignaldatabaseconnectionchanged(uedatabaseconnectionstatus::not_connected); } // default destructor qvariant uepeoplemodel::data(const qmodelindex &index, int role) const { switch(role) { case ueroleimage: { return qstring::number(index.row()); } break; // case case uerolename: { return this->record(index.row()).value(ueposdatabase::uetableindexes::uetablepeople::index_name).tostring(); } break; // case case uerolepassword: { return this->record(index.row()).value(ueposdatabase::uetableindexes::uetablepeople::index_apppassword).tostring(); } break; // case default: { return qsqlquerymodel::data(index, role); } break; // default } // switch return qvariant(); } // data qimage uepeoplemodel::ueimage(const qstring &id) const { return qimage::fromdata(this->record(id.toint()).value(ueposdatabase::uetableindexes::uetablepeople::index_image).tobytearray(), "png").scaled(uedefaults::uegraphics::people_image_width, uedefaults::uegraphics::people_image_height, qt::ignoreaspectratio, qt::smoothtransformation); } // ueimage qimage uepeoplemodel::requestimage(const qstring &id, qsize *size, const qsize &requestedsize) { q_unused(size) q_unused(requestedsize); // if(size) // { // *size=qsize(uedefaults::uegraphics::people_image_width, // uedefaults::uegraphics::people_image_height); // } // if //return this->ueimage(id); return qimage::fromdata(this->record(id.toint()).value(ueposdatabase::uetableindexes::uetablepeople::index_image).tobytearray(), "png").scaled(uedefaults::uegraphics::people_image_width, uedefaults::uegraphics::people_image_height, qt::ignoreaspectratio, qt::smoothtransformation); } // requestimage uetyperoles uepeoplemodel::rolenames() const { uetyperoles roles; const int irolename=uepeoplemodel::uerolename; const int iroleimage=uepeoplemodel::ueroleimage; const int irolepassword=uepeoplemodel::uerolepassword; roles.insert(irolename, "uerolename"); roles.insert(iroleimage, "ueroleimage"); roles.insert(irolepassword, "uerolepassword"); return roles; } // rolenames void uepeoplemodel::ueconnecttodatabase() { if(!qsqldatabase::connectionnames().contains(ueposdatabase::uedatabaseconnectionnames::database_connection_name_people, qt::caseinsensitive)) { this->uesetdatabase(qsqldatabase::adddatabase(ueposdatabase::database_driver, ueposdatabase::uedatabaseconnectionnames::database_connection_name_people)); } // if this->uedatabase().sethostname(ueposdatabase::uedatabaseconnectionparameters::database_hostname); this->uedatabase().setdatabasename(ueposdatabase::uedatabaseconnectionparameters::database_name); this->uedatabase().setusername(ueposdatabase::uedatabaseconnectionparameters::database_username); this->uedatabase().setpassword(ueposdatabase::uedatabaseconnectionparameters::database_password); if(this->uedatabase().open()) { this->setquery(ueposdatabase::uesqlqueries::uetablepeople::sql_query_get_all_people, this->uedatabase()); emit this->uesignaldatabaseconnectionchanged(uedatabaseconnectionstatus::connected); } else { emit this->uesignaldatabaseconnectionchanged(uedatabaseconnectionstatus::not_connected); } // if } // ueconnecttodatabase uetypeusers* uepeoplemodel::uefetchusers() { uetypeusers* users=new uetypeusers(); for(int iindex=0; iindex<this->record().count(); iindex++) { users->append(new ueuserrecord(this, this->record(iindex).value(ueposdatabase::uetableindexes::uetablepeople::index_id).tostring(), this->record(iindex).value(ueposdatabase::uetableindexes::uetablepeople::index_name).tostring(), this->record(iindex).value(ueposdatabase::uetableindexes::uetablepeople::index_apppassword).tostring())); } // return users; } // uefetchusers
why getting error?
you need tell combobox role use. try adding textrole: "uerolename"
combobox
.
Comments
Post a Comment