Код подключение БД предоставляю ниже.
Функция
eventsForDate(const QDate &date) стырена из примера в QT (Calendar)
Единственное,что есть в таблице (Grocery shopping) не появляется при запуске программы :(
БД находится в папке самого проекта, вот скриншот:
main.cpp#include <QtQml>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "qtquickcontrolsapplication.h"
#include "sqleventmodel.h"
#include "listmodel.h"
int main(int argc, char *argv[])
{
QtQuickControlsApplication app(argc, argv);
QQmlApplicationEngine engine;
qmlRegisterType<SqlEventModel>("project.calendar", 1, 0, "SqlEventModel");
SqlEventModel database;
database.createConnection();
engine.rootContext()->setContextProperty("database", &database);
engine.load(QUrl(QStringLiteral("qrc:/qml/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;
return app.exec();
}
sqleventmodel.h#ifndef SQLEVENTMODEL_H
#define SQLEVENTMODEL_H
#include <QList>
#include <QObject>
#include <QDebug>
#include <QSqlQuery>
#include <QSqlError>
#include <QSqlDatabase>
#include <QFile>
#include <QDate>
#include "event.h"
#define DATABASE_HOSTNAME "EventsDB"
#define DATABASE_NAME "events.db"
#define TABLE "Events" // Название таблицы
#define TABLE_NAME "name" // Вторая колонка
#define TABLE_SD "startDate" // Третья колонка
#define TABLE_HOUR "hour" // Четвертая колонка
#define TABLE_ED "endDate"
#define TABLE_MIN "min"
class SqlEventModel : public QObject
{
Q_OBJECT
public:
explicit SqlEventModel(QObject *parent = 0);
~SqlEventModel();
void createConnection(); //открытие БД
Q_INVOKABLE QList<QObject*> eventsForDate(const QDate &date);
private:
QSqlDatabase db;
bool createTable();
void closeDataBase();
};
sqleventmodel.cpp#include "sqleventmodel.h"
#include <QDebug>
#include <QFileInfo>
#include <QSqlError>
#include <QSqlQuery>
SqlEventModel::SqlEventModel(QObject *parent) : QObject(parent)
{
createConnection();
}
SqlEventModel::~SqlEventModel()
{
}
void SqlEventModel::createConnection() //открытие БД
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setHostName(DATABASE_HOSTNAME);
db.setDatabaseName(DATABASE_NAME);
if (!db.open()) {
qFatal("Cannot open database");
return;
}
return;
}
void SqlEventModel::closeDataBase()
{
db.close();
}
QList<QObject*> SqlEventModel::eventsForDate(const QDate &date)
{
const QString queryStr = QString::fromLatin1("SELECT * FROM " TABLE " WHERE '%1' >= " TABLE_SD " AND '%1' <= " TABLE_ED "").arg(date.toString("yyyy-MM-dd"));
QSqlQuery query(queryStr);
QList<QObject*> events;
while (query.next()) {
Event *event = new Event(this);
event->setName(query.value(TABLE_NAME).toString());
QDateTime startDate;
startDate.setDate(query.value(TABLE_SD).toDate());
startDate.setTime(QTime(0, 0).addSecs(query.value(TABLE_HOUR).toInt()));
event->setStartDate(startDate);
QDateTime endDate;
endDate.setDate(query.value(TABLE_ED).toDate());
endDate.setTime(QTime(0, 0).addSecs(query.value(TABLE_MIN).toInt()));
event->setEndDate(endDate);
events.append(event);
}
return events;
}
bool SqlEventModel::createTable()
{
QSqlQuery query;
if(!query.exec( "CREATE TABLE " TABLE " ("
"id INTEGER PRIMARY KEY AUTOINCREMENT, "
TABLE_NAME " VARCHAR(255) NOT NULL,"
TABLE_SD " VARCHAR(255) NOT NULL,"
TABLE_HOUR " INTEGER NOT NULL,"
TABLE_ED " VARCHAR(255) NOT NULL,"
TABLE_MIN " INTEGER NOT NULL"
" )"
)){
qDebug() << "DataBase: error of create " << TABLE;
qDebug() << query.lastError().text();
return false;
} else {
return true;
}
return false;
}
main.qml
Прикреплен в комментарии ниже