model: SqlQueryModel TabView qml
-
ho scritto sul forum internazionale non ottenendo risposte ... ho supposto di essermi spiegato male come al solito ...
quindi riporto anche qua:ho utilizzato un wiki per creare una classe per "catturare" delle query da database e inserirle in una tableView in una pagina ui.qml.
Il problema è che pur funzionando la query e la classe (inserendo dei qDebug si vedono i risultati correttamente) non riesco a fare comparire la tabella a video.Riporto il link al wiki (ho utilizzato la classe così come scritta in fondo alla pagina perchè mi sembra perfetta per quello che mi serve) e poi il mio main e la pagina qml.
Non riesco a capire se sul qml devo richeare una listview oppure se il problema è proprio di trasferire lo SqlQueryModel al qml.
QML
import QtQuick 2.3 import QtQuick.Controls 2.3 import QtQuick.Controls 1.4 as C import QtDataVisualization 1.3 import QtQuick.LocalStorage 2.0 import QtQuick.Window 2.10 import Qt.labs.calendar 1.0 import QtGraphicalEffects 1.0 import QtQuick.Controls.Imagine 2.3 import QtQuick.Extras 1.4 import QtQuick.XmlListModel 2.0 import QtQml.Models 2.1 import QtCharts 2.0 import QtQuick.Layouts 1.1 import UserRegistry 1.0 /* SqlQueryModel */ Page { id: MyPg7 width: 1440 height: 900 Layout.fillWidth: true Layout.fillHeight: true Layout.preferredWidth: 1440 Layout.preferredHeight: 900 Layout.minimumWidth: 1440 Layout.minimumHeight: 900 Rectangle { id: page7Rect x: 0 y: 0 width: 1440 height: 818 Layout.fillWidth: true Layout.fillHeight: true Layout.preferredWidth: 1440 Layout.preferredHeight: 840 Layout.minimumWidth: 1440 Layout.minimumHeight: 840 color: "#ffffff" //property alias currentIndex: homeRoot.currentIndex BannerPg1 { id: bannerPg7 Layout.fillWidth: true Rectangle { id: settimoRoot x: 0 y: 50 width: 1440 height: 769 color: "#ffffff" Rectangle { id: rectangle x: 8 y: 8 width: 250 height: 753 color: "#ffffff" } Rectangle { id: rectangle1 x: 264 y: 70 width: 1168 height: 691 color: "#ffffff" C.TableView { id: tableViewUser x: 8 y: 8 width: 1152 height: 675 verticalScrollBarPolicy: 2 anchors.fill: parent clip: true model: SqlQueryModel /* Inserendo un debug su sqlquerymodel.cpp si ottengono i corretti "ROLE" poi riportati nella pagina7 all'interno di C.TableViewColumn.*/ C.TableViewColumn { title: "User id" role: "IDuser" width: title.length * 10 } C.TableViewColumn { title: "Nome" role: "nome" width: title.length * 50 } C.TableViewColumn { title: "Cognome" role: "Cognome" width: title.length * 30 } C.TableViewColumn { title: "Data di Nascita" role: "nascita" width: title.length * 10 } C.TableViewColumn { title: "Comune di Provenienza" role: "localita" width: title.length * 15 } } } Rectangle { id: rectangle2 x: 264 y: 8 width: 1168 height: 56 color: "#ffffff" } } } Label { text: qsTr("You are on Page 7.") anchors.verticalCenterOffset: -383 anchors.horizontalCenterOffset: 371 anchors.centerIn: parent } } }
MAIN (il main gestisce una swipeview con 7 pagine)
#include <QGuiApplication> #include <QQmlApplicationEngine> #include <QtQuickControls2> #include <QtSql> #include <QtGui/QGuiApplication> #include <QtCore/QDir> #include <QtQuick/QQuickView> #include <QtQml/QQmlEngine> #include <QtQml/qqml.h> #include "shared/shared.h" #include <QtCharts> #include <QtDataVisualization> #include <QAbstractTableModel> #include <QtMessageHandler> #include <QMessageBox> #include <QMessageLogContext> #include <QMessageLogger> #include <QDebug> #include <QQmlEngine> #include "sqlquerymodel.h" using namespace QtCharts; int main(int argc, char *argv[]) { QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName("/home/pc/Qt/TestApp/DataBase/TestAnalyticsDB"); if(db.open()) {//{ QMessageBox::information(nullptr,"Ok","Connection ok"); qDebug() << "connessione ok"; } else qDebug() << "connessione FALLITA";//QMessageBox::information(nullptr,"Error","some error."); SqlQueryModel *UserRegistry = new SqlQueryModel(nullptr); UserRegistry->setQuery("SELECT * FROM userData"); //qDebug() << "risultato della query: "<< UserRegistry->record(1); /* ottengo risultato corretto*/ qmlRegisterType<SqlQueryModel>("UserRegistry", 1, 0, "SqlQueryModel"); QSqlQuery query; query.exec("SELECT nome FROM userData WHERE IDuser > 0"); while (query.next()) { QString name = query.value(0).toString(); qDebug() << "un user name: "<< name; /* ottengo la lista corretta del campo name*/ } QGuiApplication app(argc, argv); QQmlApplicationEngine engine; engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); if (engine.rootObjects().isEmpty()) return -1; return app.exec(); }
Inserendo un debug su sqlquerymodel.cpp si ottengono i corretti "ROLE" poi riportati nella pagina7 all'interno di C.TableViewColumn.
Non riesco a capire perchè il tutto non poirti al risultato.
-
Non mi sembra tu abbia seguito molto il wiki... in pratica invece di
qmlRegisterType<SqlQueryModel>("UserRegistry", 1, 0, "SqlQueryModel");
devi seguire le istruzioni al passo 5.L'idea e' invece di far sapere a QML cosa sia
SqlQueryModel
, crei il modello direttamente in C++ e passi l'istanza direttamente a QML -
@VRonin si hai ragione non ho seguito direttamente l'esempio .... questo dipende dai 2 fatti:
- non ho capito il delegate
- QmlApplicationViewer non lo ho trovato
- ho quindi cercato di usare (maldestramente ammetto) qmlRegisterType
perchè non è possibile usare qmlRegisterType?? alla fine la classe ha tutto quello che deve avere...
comunque grazie
update:
detto questo devo capire l'uso del delegate ...
-
Allora: principalmente la difficoltà stà nel fatto che mi devo ancora "ambientare" nelle malità di render qml/quick comunque direi che al passo 5 siamo anche arrivati al dunque e non serviva fare altro. riporto il codice corretto:
#include <QGuiApplication> #include <QQmlApplicationEngine> #include <QtQuickControls2> #include <QtSql> #include <QtGui/QGuiApplication> #include <QtCore/QDir> #include <QtQuick/QQuickView> #include <QtQml/QQmlEngine> #include <QtQml/qqml.h> #include "shared/shared.h" #include <QtCharts> #include <QtDataVisualization> #include <QAbstractTableModel> #include <QtMessageHandler> #include <QMessageBox> #include <QMessageLogContext> #include <QMessageLogger> #include <QDebug> #include <QQmlEngine> #include "sqlquerymodel.h" using namespace QtCharts; int main(int argc, char *argv[]) { QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); QGuiApplication app(argc, argv); QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName("/home/pc/Qt/TestApp/DataBase/TestAnalyticsDB"); if(db.open()) {//{ QMessageBox::information(nullptr,"Ok","Connection ok"); qDebug() << "connessione ok"; } else qDebug() << "connessione FALLITA";//QMessageBox::information(nullptr,"Error","some error."); SqlQueryModel *UserRegistry = new SqlQueryModel(nullptr); UserRegistry->setQuery("SELECT * FROM userData"); SqlQueryModel *AdmRegistry = new SqlQueryModel(nullptr); AdmRegistry->setQuery("SELECT * FROM admData"); QQmlApplicationEngine engine; engine.rootContext()->setContextProperty("userModel", UserRegistry); /* the trick */ engine.rootContext()->setContextProperty("admModel", AdmRegistry); /* second query table model */ engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); if (engine.rootObjects().isEmpty()) return -1; return app.exec(); }
e poi nel codice ui.qml alla sezione tableView:
C.TableView { id: tableViewUser x: 8 y: 8 width: 1152 height: 244 anchors.right: parent.right anchors.left: parent.left anchors.top: parent.top verticalScrollBarPolicy: 2 clip: true model: userModel /* the trick */ C.TableViewColumn { title: "User id" role: "IDuser" width: title.length * 10 visible: true } /* other column*/ /* second table*/ C.TableView { id: tableViewData x: 0 y: 250 width: 1168 height: 433 anchors.right: parent.right anchors.left: parent.left anchors.top: parent.bottom verticalScrollBarPolicy: 2 clip: true model: admModel /* second query table model */ C.TableViewColumn { title: "Sensore 1" role: "sens1" width: title.length * 15 }
e questo è tutto .... immagino che creando una classe specifica ( modificando SqlQueryModel per esempio) sarà facile ricreare layout diversi e tabelle "relazionali".