QList<QObject*> model question
-
Hello, I'm trying to build an leader-board model that would be filled with Object List, the code looks like:
void UserHandler::handleLeaderboard() { qDebug() << "In UserHandler.handleLeaderboard"; QList<QObject*> leaderList; if (l_db.open()) { qDebug() << "DB connection opened."; QSqlQuery leaderFetch; //Fetch data to be filled in leaderboardData model QString leader_query = QString("SELECT rowus.place ,us.login,us.Points from users us,(SELECT ROW_NUMBER() OVER (ORDER BY points desc) AS place FROM users) rowus where rowus.Place < 101 order by Points desc, login asc;"); qDebug() << "Querry "<< leader_query; if (leaderFetch.exec(leader_query)) { while (leaderFetch.next()) { leaderList.append(new LeaderboardData(leaderFetch.value(0).toInt(), leaderFetch.value(1).toString(),leaderFetch.value(2).toInt())); qDebug() << "Querry got user: "<<leaderFetch.value(1).toString(); } l_db.close(); } else { qDebug() << "Error happened - " << l_db.lastError().text(); qDebug() << "Closing connection"; l_db.close(); gotError("Ooops, there seems to be a problem"); } } QQuickView view; view.setResizeMode(QQuickView::SizeRootObjectToView); QQmlContext *ctxt = view.rootContext(); ctxt->setContextProperty("leaderboardModel", QVariant::fromValue(leaderList)); }
and I call it in QML as
TableView { id:tblLeaders anchors.fill: parent TableViewColumn { id: colView role: "place" title: "Place" width: 36 } TableViewColumn { id: colLogin role: "login" title: "Username" width: parent.width - colView.width - colPoints.width } TableViewColumn { id: colPoints role: "points" title: "Points" width: 128 } model: leaderboardModel }
But When the view gets rendered I get:
qrc:/Leaderboards.qml:56: ReferenceError: leaderboardModel is not defined
Where and how i should define the context for this model for it to be accessible in QML?
-
make sure setContextProperty() call happens before you set the QML file.
Is this the case? -
@raven-worx Oh, this might be the case. I have a TabView (that is not visible until the handleLeaderboard logic is executed) storing the Leaderboards.qml. But I guess Leaderboards.qml was set on declaring it with
visible:false
and the error was shown only on switching to the tab containing the QML. Is it so?
Also what could I use to not set the QML file until a custom specific signal is emitted?
-
@Verhoher said:
Also what could I use to not set the QML file until a custom specific signal is emitted?
alternatively you could initially add a QObject* as context property. and let this object manage the list retrieval. Then from the object you can trigger a signal and react on it in QML for example.
-
@raven-worx Thanks, will try that.