]> Johnzone git - UserSheets.git/commitdiff
using sql query model, not yet working correctly
authorJohn Janus <mail@johnzone.org>
Mon, 6 Mar 2017 07:10:43 +0000 (08:10 +0100)
committerJohn Janus <mail@johnzone.org>
Mon, 6 Mar 2017 07:10:43 +0000 (08:10 +0100)
UserSheets.pro
controller.cpp
controller.h
database.cpp
database.h
humandatamodel.cpp [new file with mode: 0644]
humandatamodel.h [new file with mode: 0644]
logging.h
main.cpp
main.qml

index a5b4c0ef3f7ebe83d9980a637e2973db85034404..1cd5e6e8d7329fb07b88a3b7661fd40145491c0d 100644 (file)
@@ -1,11 +1,12 @@
-QT += qml quick sql widgets
-
+QT += qml quick sql
+!android: QT += widgets
 CONFIG += c++11
 
 SOURCES += main.cpp \
     database.cpp \
     controller.cpp \
-    logging.cpp
+    logging.cpp \
+    humandatamodel.cpp
 
 RESOURCES += qml.qrc
 
@@ -37,8 +38,10 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin
 HEADERS += \
     database.h \
     controller.h \
-    logging.h
+    logging.h \
+    humandatamodel.h
 
-DISTFILES += style.astylrc \
-    logrules.ini
-#DEFINES += QT_LOGGING_CONF="logrules.ini"
+DISTFILES += \
+    logrules.ini \
+    style.astylerc
+DEFINES += QT_LOGGING_CONF="logrules.ini"
index 8455eb9e153970e0d2cb4f20a752cd45a5ffd578..56767a2fcf4c614307f54cbc4e6d67600f7588e9 100644 (file)
@@ -1,22 +1,29 @@
 #include "controller.h"
 #include <QDebug>
 #include <QQuickWindow>
+#include "humandatamodel.h"
 
 Controller::Controller (DataBase* d, QObject* parent) :
   QObject (parent),
   db{d}
 {
   engine = new QQmlApplicationEngine();
+
+  qmlRegisterType<HumanDataModel> ("org.johnzone.usersheets.sqlmodels", 1, 0, "HumanDataModel");
+
   this->engine->load (QUrl (QLatin1String ("qrc:/main.qml") ) );
   //connect qml Signals to controller
   QList<QObject*> roots = engine->rootObjects();
-  QObject* qmlRoot = roots.first();
+  qmlRoot = roots.first();
 
   QObject::connect (qmlRoot, SIGNAL (openAddHuman() ),
                     this, SLOT (openAddHuman() ) );
 
   QObject::connect (qmlRoot, SIGNAL (openAddService() ),
                     this, SLOT (openAddService() ) );
+  QObject* humanslist = qmlRoot->findChild<QObject*> ("humanslist");
+
+  QObject::connect (db, SIGNAL (humanChanged() ), humanslist, SLOT (dataChanged() ) );
 
 }
 
@@ -31,6 +38,8 @@ void Controller::openAddHuman()
     QQmlEngine::setObjectOwnership (dialog, QQmlEngine::JavaScriptOwnership);
     QObject::connect (dialog, SIGNAL (addHuman (QVariant, QVariant, QVariant) ),
                       db, SLOT (addHuman (QVariant, QVariant, QVariant) ) );
+//    QObject::connect(db, SIGNAL(humanChanged(),
+//                                qmlRoot, SLOT()));
 
   } else {
     qDebug() << "Dialog not loaded";
index 7ccf519a850b6ff2266163ee2312b1e2b40aecd1..a527fbbaea628733d352be7f071beff9ea4d7553 100644 (file)
@@ -23,6 +23,7 @@ public slots:
 private:
   QQmlApplicationEngine* engine;
   DataBase* db;
+  QObject* qmlRoot;
 };
 
 #endif // CONTROLLER_H
index 712859900ed68887c48dac77a3e61032e0f7ecfb..2f88c87f38b45278fd28ad856ea4d9109b323cc4 100644 (file)
@@ -8,7 +8,7 @@ DataBase::DataBase (QObject* parent) : QObject (parent)
   db = QSqlDatabase::addDatabase ("QSQLITE");
   db.setDatabaseName ("usersheets.db");
   if (!db.open() ) {
-    //do stuff
+    qCCritical (dbase) << "Opening database failed.";
   }
 
   qCDebug (dbase) << initDB();
@@ -21,7 +21,7 @@ DataBase::~DataBase()
 }
 
 void DataBase::addHuman (const QVariant& name, const QVariant& firstname,
-                         const QVariant& birthday)
+                         const QVariant& birthday) const
 {
   qCDebug (dbase) << "addHuman slot called with: " << name << ", " << firstname << ", " << birthday;
   QSqlQuery q;
@@ -30,11 +30,12 @@ void DataBase::addHuman (const QVariant& name, const QVariant& firstname,
   q.addBindValue (firstname.toString() );
   q.addBindValue (birthday.toDate() );
   if (!q.exec() ) qCDebug (dbase) << "error: " << q.lastError();
+  else emit humanChanged();
 
 }
 
 void DataBase::addService (const QVariant& name, const QVariant& url,
-                           const QVariant& description)
+                           const QVariant& description) const
 {
   qCDebug (dbase) << "addService slot called with: " << name << ", " << url << ", " << description;
   QSqlQuery q;
@@ -43,10 +44,11 @@ void DataBase::addService (const QVariant& name, const QVariant& url,
   q.addBindValue (url.toUrl() );
   q.addBindValue (description.toString() );
   if (!q.exec() ) qCDebug (dbase) << "error: " << q.lastError();
+  else emit serviceChanged();
 }
 
 void DataBase::addUser (const QVariant& humanID, const QVariant& serviceID,
-                        const QString& username, const QString& password)
+                        const QString& username, const QString& password) const
 {
   QSqlQuery q;
   q.prepare (this->sqlAddUser);
@@ -54,10 +56,11 @@ void DataBase::addUser (const QVariant& humanID, const QVariant& serviceID,
   q.addBindValue (serviceID);
   q.addBindValue (username);
   q.addBindValue (password);
-  q.exec();
+  if (!q.exec() ) qCDebug (dbase) << "error: " << q.lastError();
+  else emit serviceChanged();
 }
 
-QSqlError DataBase::initDB()
+QSqlError DataBase::initDB() const
 {
   QStringList tables = db.tables();
   QSqlQuery q;
index 677aea01ee4ca2930026345137ae2d3cc731a218..52e8da36f63cc0cb0e7e8800cdaf2b2ff0b5176f 100644 (file)
 class DataBase : public QObject
 {
   Q_OBJECT
+  QSqlError initDB() const;
+  QSqlDatabase db;
+
 public:
   explicit DataBase (QObject* parent = 0);
   virtual ~DataBase();
 
 signals:
+  void humanChanged() const;
+  void serviceChanged() const;
+  void userChanged() const;
 
 public slots:
   void addHuman (const QVariant& name, const QVariant& firstname,
-                 const QVariant& birthday);
+                 const QVariant& birthday) const;
 
   void addService (const QVariant& name, const QVariant& url,
-                   const QVariant& description);
+                   const QVariant& description) const;
 
   void addUser (const QVariant& humanID, const QVariant& serviceID,
-                const QString& username, const QString& password);
+                const QString& username, const QString& password) const;
 
 
 private:
-  QSqlError initDB();
-  QSqlDatabase db;
-
-  const QLatin1String sqlCreateHumanTable = QLatin1String (
-        "create table human("
-        "id integer primary key autoincrement,"
-        "name varchar not null,"
-        "firstname varchar,"
-        "birthday date"
-        ")");
+  const QLatin1String sqlCreateHumanTable
+  {
+    "create table human("
+    "id integer primary key autoincrement,"
+    "name varchar not null,"
+    "firstname varchar,"
+    "birthday date"
+    ")"
+  };
 
-  const QLatin1String sqlCreateServiceTable = QLatin1String (
-        "create table service("
-        "id integer primary key autoincrement,"
-        "name varchar not null,"
-        "url varchar not null,"
-        "description varchar"
-        ")");
+  const QLatin1String sqlCreateServiceTable {
+    "create table service("
+    "id integer primary key autoincrement,"
+    "name varchar not null,"
+    "url varchar not null,"
+    "description varchar"
+    ")"};
 
-  const QLatin1String sqlCreateUserTable = QLatin1String (
-        "create table user("
-        "id integer primary key autoincrement,"
-        "humanid integer not null,"
-        "serviceid integer not null,"
-        "username varchar,"
-        "password varchar,"
-        "foreign key(humanid) references human(id),"
-        "foreign key(serviceid) references service(id)"
-        ")");
+  const QLatin1String sqlCreateUserTable {
+    "create table user("
+    "id integer primary key autoincrement,"
+    "humanid integer not null,"
+    "serviceid integer not null,"
+    "username varchar,"
+    "password varchar,"
+    "foreign key(humanid) references human(id),"
+    "foreign key(serviceid) references service(id)"
+    ")"};
 
-  const QLatin1String sqlAddHuman = QLatin1String (
-                                      "insert or ignore into "
-                                      "human "
-                                      "(name, firstname, birthday)"
-                                      " values "
-                                      "(?,?,?)"
-                                    );
+  const QLatin1String sqlAddHuman {
+    "insert or ignore into "
+    "human "
+    "(name, firstname, birthday)"
+    " values "
+    "(?,?,?)"
+  };
 
-  const QLatin1String sqlAddService = QLatin1String (
-                                        "insert or ignore into "
-                                        "service "
-                                        "(name, url, description)"
-                                        " values "
-                                        "(?,?,?)"
-                                      );
+  const QLatin1String sqlAddService {
+    "insert or ignore into "
+    "service "
+    "(name, url, description)"
+    " values "
+    "(?,?,?)"
+  };
 
-  const QLatin1String sqlAddUser = QLatin1String (
-                                     "insert or ignore into "
-                                     "user "
-                                     "(humanid, serviceid, username, password)"
-                                     " values "
-                                     "(?,?,?,?)"
-                                   );
+  const QLatin1String sqlAddUser {
+    "insert or ignore into "
+    "user "
+    "(humanid, serviceid, username, password)"
+    " values "
+    "(?,?,?,?)"
+  };
 };
 
 #endif // DATABASE_H
diff --git a/humandatamodel.cpp b/humandatamodel.cpp
new file mode 100644 (file)
index 0000000..1879f67
--- /dev/null
@@ -0,0 +1,42 @@
+#include "humandatamodel.h"
+#include <QSqlQuery>
+#include <QSqlError>
+#include <QSqlRecord>
+
+HumanDataModel::HumanDataModel (QObject* parent)
+  : QSqlQueryModel (parent)
+{
+  QSqlQuery query;
+  if (!query.exec ("select * from human") ) qCCritical (dbase) << "Query for human failed: " << query.lastError();
+  setQuery (query);
+  if (lastError().isValid() ) qCCritical (dbase) << "Could not set query for HumanDataModel: " << lastError();
+
+}
+
+HumanDataModel::~HumanDataModel()
+{
+
+}
+
+QHash<int, QByteArray> HumanDataModel::roleNames() const
+{
+  QHash<int, QByteArray> roles;
+  for (int i = 0; i < record().count(); i++) roles.insert (Qt::UserRole + i + 1, record().fieldName (i).toUtf8() );
+  return roles;
+}
+
+QVariant HumanDataModel::data (const QModelIndex& index, int role) const
+{
+  QVariant data;
+
+  if (index.isValid() ) {
+    if (role < Qt::UserRole) {
+      data = QSqlQueryModel::data (index, role);
+    } else {
+      int columnIdx = role - Qt::UserRole - 1;
+      QModelIndex modelIndex = this->index (index.row(), columnIdx);
+      data = QSqlQueryModel::data (modelIndex, Qt::DisplayRole);
+    }
+  }
+  return data;
+}
diff --git a/humandatamodel.h b/humandatamodel.h
new file mode 100644 (file)
index 0000000..c86353a
--- /dev/null
@@ -0,0 +1,20 @@
+#ifndef HUMANDATAMODEL_H
+#define HUMANDATAMODEL_H
+#include <QSqlQueryModel>
+#include <QObject>
+#include <QDebug>
+#include <QHash>
+#include "logging.h"
+
+
+class HumanDataModel : public QSqlQueryModel
+{
+public:
+  HumanDataModel (QObject* parent = 0);
+  ~HumanDataModel();
+
+  QHash<int, QByteArray> roleNames() const;
+  QVariant data (const QModelIndex& model, int role) const;
+};
+
+#endif // HUMANDATAMODEL_H
index 25fd4bbb1da1ad88b916edb3439547dd10a8cc2c..a022884d71e7e5eda71e78940ea901434093c119 100644 (file)
--- a/logging.h
+++ b/logging.h
@@ -1,6 +1,7 @@
 #ifndef LOGGING_H
 #define LOGGING_H
 #include <QLoggingCategory>
+#include <QDebug>
 
 const QtMsgType loglevel = QtMsgType::QtWarningMsg;
 Q_DECLARE_LOGGING_CATEGORY (dbase)
index 4c99656d7ecfa094fdc335dfc085fcebb658f40f..a6a53038a56db57ecdb05b10d67ffaa744b3605f 100644 (file)
--- a/main.cpp
+++ b/main.cpp
@@ -1,13 +1,13 @@
 #include <QApplication>
 #include "database.h"
 #include "controller.h"
-#include "logging.h"
 
 int main (int argc, char* argv[])
 {
 //  QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
   QApplication app (argc, argv);
-  qSetMessagePattern ("[%{time yyyyMMdd h:mm:ss.zzz t}] %{if-category}%{category}: %{endif}%{message}");
+  qSetMessagePattern ("[%{time yyyyMMddThh:mm:ss.zzz t}] [%{type}] "
+                      "[%{file}-%{line}] %{if-category}%{category}: %{endif}%{message}");
   DataBase db;
   Controller c (&db);
 
index 50af0d4f58516774d1a4042e40d48c058326d26f..e14dba3357cf8880a205e6ff5d359814d07891a1 100644 (file)
--- a/main.qml
+++ b/main.qml
@@ -1,6 +1,9 @@
 import QtQuick 2.7
 import QtQuick.Controls 1.4
 import QtQuick.Layouts 1.0
+import QtQml 2.2
+
+import org.johnzone.usersheets.sqlmodels 1.0
 
 ApplicationWindow {
   id: root
@@ -11,6 +14,21 @@ ApplicationWindow {
   signal openAddHuman()
   signal openAddService()
 
+  ListView {
+    id: humanslist
+    objectName: "humanslist"
+    anchors.left: parent.left
+    anchors.top:parent.top
+    anchors.bottom: btnaddhuman.top
+//    var locale = Qt.locale
+    model: HumanDataModel {}
+    delegate: Label {
+      color: model.id % 2 == 0 ? "red" : "yellow"
+//      var bd = Date.fromLocaleTimeString(locale, "yyy-MM-dd")
+      text: model.id + ": " + model.name + ", " + model.firstname + " (" + model.birthday + ")"
+    }
+  }
+
   Button {
     id: btnaddhuman
     anchors.left: parent.left