Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. Italian
  4. model: SqlQueryModel TabView qml
QtWS25 Last Chance

model: SqlQueryModel TabView qml

Scheduled Pinned Locked Moved Solved Italian
4 Posts 2 Posters 772 Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • G Offline
    G Offline
    gfxx
    wrote on 2 Mar 2019, 11:15 last edited by
    #1

    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.

    bkt

    1 Reply Last reply
    0
    • VRoninV Offline
      VRoninV Offline
      VRonin
      wrote on 3 Mar 2019, 17:38 last edited by
      #2

      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

      "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
      ~Napoleon Bonaparte

      On a crusade to banish setIndexWidget() from the holy land of Qt

      G 1 Reply Last reply 4 Mar 2019, 07:27
      0
      • VRoninV VRonin
        3 Mar 2019, 17:38

        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

        G Offline
        G Offline
        gfxx
        wrote on 4 Mar 2019, 07:27 last edited by gfxx 3 Apr 2019, 15:45
        #3

        @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:

        • qmlapplicationviewer.h
        • qmlapplicationviewer.cpp

        detto questo devo capire l'uso del delegate ...

        bkt

        1 Reply Last reply
        0
        • G Offline
          G Offline
          gfxx
          wrote on 4 Mar 2019, 19:12 last edited by
          #4

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

          bkt

          1 Reply Last reply
          0

          1/4

          2 Mar 2019, 11:15

          • Login

          • Login or register to search.
          1 out of 4
          • First post
            1/4
            Last post
          0
          • Categories
          • Recent
          • Tags
          • Popular
          • Users
          • Groups
          • Search
          • Get Qt Extensions
          • Unsolved