Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

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.

    WIKI LINK.

    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".


Log in to reply