Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. QML and Qt Quick
  4. [Solved] Making a QML plugin for Sql Databases that makes models.
Forum Updated to NodeBB v4.3 + New Features

[Solved] Making a QML plugin for Sql Databases that makes models.

Scheduled Pinned Locked Moved QML and Qt Quick
5 Posts 2 Posters 2.3k Views 1 Watching
  • 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.
  • B Offline
    B Offline
    bobweaver
    wrote on last edited by
    #1

    I started by using a tutorial "on-line":http://qt-project.org/wiki/How_to_use_a_QSqlQueryModel_in_QML and noticed that it is a little old and so I looked at examples. And Still can not get it to work.

    UPDATE
    The Code is now working at the repo, Thanks to all for your Help.
    It turned out as stated in a post below that I needed to change the generateRoleNames to just roleNames. Feel Free to try out the Code yourself at the Link below. There is a example file and docs in the repo located here.
    https://github.com/bobweaver/sqlDatabase

    1 Reply Last reply
    0
    • C Offline
      C Offline
      chrisadams
      wrote on last edited by
      #2

      Hi,

      Your SqlModel type (I assume it extends QAbstractListModel?) needs to implement the following virtual function:

      QHash<int,QByteArray> roleNames() const;

      eg: a static example, with predefined rolenames:

      @
      class SqlModel : public QAbstractListModel
      {
      Q_OBJECT
      Q_ENUMS(Roles)

      public:
      enum Roles {
      EmployeeIdentifier = 0,
      EmployeeName,
      EmployeeImage
      };

      SqlModel(QObject *parent);
      ~SqlModel();
      
      int rowCount(const QModelIndex &parent) const;
      QVariant data(const QModelIndex &index, int role) const;
      QHash<int,QByteArray> roleNames() const;
      

      };

      // ... the other functions / ctor / dtor definitions go here...

      QHash<int,QByteArray> SqlModel::roleNames() const
      {
      QHash<int, QByteArray> roles;
      roles.insert(EmployeeIdentifier, "employeeIdentifier");
      roles.insert(EmployeeName, "employeeName");
      roles.insert(EmployeeImage, "employeeImage");
      return roles;
      }
      @

      1 Reply Last reply
      0
      • B Offline
        B Offline
        bobweaver
        wrote on last edited by
        #3

        This is what I have atm and it is not working thanks for your help

        .h
        @#ifndef SQLQUERYMODEL_H
        #define SQLQUERYMODEL_H
        #include <QVariant>
        #include <QSqlQueryModel>
        #include <QSqlDatabase>
        class SqlQueryModel : public QSqlQueryModel
        {
        Q_OBJECT
        public:
        explicit SqlQueryModel(QObject *parent = 0);
        Q_INVOKABLE void setQuery(const QString &query, const QSqlDatabase &db = QSqlDatabase());
        Q_INVOKABLE void setQuery(const QSqlQuery &query);
        Q_INVOKABLE QVariant data(const QModelIndex &index, int role)const;
        QHash<int, QByteArray>generateRoleNames() const;
        signals:
        public slots:
        private:
        };
        #endif // QSQLQUERYMODEL_H@

        .cpp
        @
        #include "sqlquerymodel.h"
        #include"sqlquery.h"
        #include <QSqlRecord>
        #include <QSqlField>
        #include <QDebug>
        #include <QVariant>
        #include <QAbstractListModel>
        SqlQueryModel::SqlQueryModel(QObject *parent) :
        QSqlQueryModel(parent)
        {
        }
        void SqlQueryModel::setQuery(const QString &query, const QSqlDatabase &db)
        {
        QSqlQueryModel::setQuery(query,db);
        generateRoleNames();
        }

        void SqlQueryModel::setQuery(const QSqlQuery &query)
        {
        QSqlQueryModel::setQuery(query);
        generateRoleNames();
        }

        QHash<int, QByteArray>SqlQueryModel::generateRoleNames() const
        {
        QHash<int,QByteArray> hash;
        for( int i = 0; i < record().count(); i++) {
        hash.insert(Qt::UserRole + i + 1, QByteArray(record().fieldName(i).toLatin1()));
        qDebug() << hash << "\n" ;
        }
        return hash;
        }

        QVariant SqlQueryModel::data(const QModelIndex &index, int role)const
        {
        QVariant value = QSqlQueryModel::data(index, role);
        if(role < Qt::UserRole)
        {
        value = QSqlQueryModel::data(index, role);
        }
        else
        {
        int columnIdx = role - Qt::UserRole - 1;
        QModelIndex modelIndex = this->index(index.row(), columnIdx);
        value = QSqlQueryModel::data(modelIndex, Qt::DisplayRole);
        }
        return value;
        }

        @
        I am qdebuging the hash names as you can see in the function generateRoleNames But sill in qml I Do not get anything back.
        from the debug
        @
        QHash((268, "title_pronounce")(269, "stereo")(288, "videoprop")(266, "stars")(267, "previouslyshown")(264, "category_type")(265, "airdate")(278, "colorcode")(279, "syndicatedepisodenumber")(276, "originalairdate")(277, "showtype")(274, "parttotal")(275, "seriesid")(272, "closecaptioned")(273, "partnumber")(286, "audioprop")(287, "subtitletypes")(284, "first")(285, "last")(282, "generic")(283, "listingsource")(280, "programid")(281, "manualid")(262, "description")(263, "category")(260, "title")(261, "subtitle")(258, "starttime")(259, "endtime")(257, "chanid")(270, "subtitled")(271, "hdtv"))
        @
        getting the count
        @
        9874
        @
        error saying that the role is not set even though it says it is in qdebug or I dont understand it. kinda new to all this ....
        @
        file:///home/joseph/Templates/untitled49/untitled49.qml:20: ReferenceError: last is not defined
        file:///home/joseph/Templates/untitled49/untitled49.qml:20: ReferenceError: last is not defined
        @

        1 Reply Last reply
        0
        • B Offline
          B Offline
          bobweaver
          wrote on last edited by
          #4

          Bump ?

          1 Reply Last reply
          0
          • C Offline
            C Offline
            chrisadams
            wrote on last edited by
            #5

            I know nothing about QSqlQueryModel unfortunately. Whenever I've exposed SQL data to QML, I've done it via a QAbstractListModel-derived type, and then in the implementation, manually performed queries on the SQL database via QtSql classes.

            But, where is your roleNames() implementation? You have a generateRoleNames() function but you don't seem to implement roleNames()?

            Cheers,
            Chris.

            1 Reply Last reply
            0

            • Login

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