Использование SQL в QML — TableView

Я хотел бы вызвать данные из моей локальной базы данных (diaBaneData.db) в TableView в QML. Но я борюсь с частью C ++ прямо сейчас.

Нет проблем с выводом моей базы данных с версией «model» из main.cpp. При использовании версии «model2» в заголовке QTableView не будет отображаться ничего, кроме заголовка. Так как версия c ++ не работает, qml-таблица также пуста.

Я думаю, что должно быть что-то не так с ролями / именами полей, но я не могу выяснить, что не так.

На выходе будет напечатано несколько строк с надписью:
QSqlQuery::value: unknown field name ''!

main.cpp

    #include <QApplication>
#include <QQmlApplicationEngine>
#include "QTableView"#include "mysqlmodel.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);

// Create the database Table inside is named "diaBaneDatabase"QSqlDatabase m_Database;
m_Database = QSqlDatabase::addDatabase("QSQLITE");
m_Database.setDatabaseName("C:/Users/blade/Desktop/diaBaneData.db");
if (!m_Database.open()) {
qDebug("ERROR");
}

// This is how my table will correctly displayed
QSqlQueryModel* model = new QSqlQueryModel;
model->setQuery("SELECT * FROM diaBaneDatabase");

// Using my own class -> nothing will be shown exepct the headline
QSqlQueryModel* model2 = new MySqlModel();
model2->setQuery("SELECT * FROM diaBaneDatabase");

QTableView *view = new QTableView;
view->setModel(model2);
view->show();

qmlRegisterType<MySqlModel>("MySqlModel", 1, 0, "MySqlModel");

QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

return app.exec();
}

mysqlmodel.h

    #ifndef MYSQLMODEL_H
#define MYSQLMODEL_H

#include <QtSql>
#include <QSqlQuery>

class MySqlModel: public QSqlQueryModel
{
Q_OBJECT
public:
MySqlModel(QObject *parent = 0) : QSqlQueryModel(parent) {}

enum Roles {
id = Qt::UserRole + 1,
dateAndTime,
bloodSugar,
eatenKE,
jubinDextro
};

QHash<int, QByteArray> roleNames() const {
QHash<int, QByteArray> roles;
roles[id] = "idRole";
roles[dateAndTime] = "dateAndTimeRole";
roles[bloodSugar] = "bloodSugarRole";
roles[eatenKE] = "eatenKERole";
roles[jubinDextro] = "jubinDextroRole";
return roles;
}

QVariant data(const QModelIndex &index, int role) const {
if (!index.isValid())
return QVariant();

QString fieldName;
switch (role) {
case id: fieldName = QStringLiteral("diaBaneDatabase.id"); break;
case dateAndTime: fieldName = QStringLiteral("diaBaneDatabase.dateAndTime"); break;
case bloodSugar: fieldName = QStringLiteral("diaBaneDatabase.bloodSugar"); break;
case eatenKE: fieldName = QStringLiteral("diaBaneDatabase.eatenKE"); break;
case jubinDextro: fieldName = QStringLiteral("diaBaneDatabase.jubinDextro"); break;
}
if (!this->record().isGenerated(fieldName))
return QVariant();
else {
QModelIndex item = indexInQuery(index);
if ( !this->query().seek(item.row()) )
return QVariant();
return this->query().value(fieldName);
}
return QVariant();
}
};

#endif // MYSQLMODEL_H

main.qml

    import QtQuick 2.5
import QtQuick.Controls 1.4
import MySqlModel 1.0

ApplicationWindow {
visible: true
width: 640
height: 480
title: qsTr("Hello World")

menuBar: MenuBar {
Menu {
title: qsTr("File")
MenuItem {
text: qsTr("&Open")
onTriggered: console.log("Open action triggered");
}
MenuItem {
text: qsTr("Exit")
onTriggered: Qt.quit();
}
}
}

MySqlModel{
id: sqlTableModel
}

TableView{
id: tableviewTTT
width: 600
height: 400
TableViewColumn{ role: "idRole" ; title: "ID" ; visible: true}
TableViewColumn{ role: "dateAndTimeRole" ; title: "DateAndTime" }
TableViewColumn{ role: "bloodSugarRole" ; title: "BloodSugar" }
TableViewColumn{ role: "eatenKERole" ; title: "EatenKE" }
TableViewColumn{ role: "jubinDextroRole" ; title: "JubinDextro" }

model: sqlTableModel
}
}

DB-файл:
База данных

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]