提示:这里是该系列文章的所有文章的目录
第一章: Qt连接Sqlite3并使用Qtableview实时显示数据,重写QSqlQueryModel实现文本居中
第二章: Qt下使用Sqlite数据库实现图片的读写显示
什么是 SQLite?
SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库不一样,您不需要在系统中配置。(来自菜鸟教程SQLite简介)
在我以前的文章有介绍Qt下MySQL数据库的使用,需要进行MySQL服务器的连接,有时候还需要编译Qt源码来获取MySQL驱动,使用起来有点麻烦。如果我们的项目不需要一个单独的服务器进程或操作的系统(无服务器的),这时候可以选择使用SQLite数据库来保存数据,这里介绍一下Qt中自带驱动的Sqlite3数据库的使用,并结合相应的示例进行讲解,标题功能的体现见示例完整代码,如有错误之处,欢迎大家批评指正。
提示:以下是本篇文章正文内容,下面案例可供参考
在Qt项目文件(.pro文件)中,加入SQL模块:
QT += sql
有的pro中是有“Qt += core gui”的,可以直接加在这后面:
QT += core gui sql
添加头文件
#include
#include
#include
#include
1.在指定保存路径下以当天日期为名称创建数据库并打开
QString dbPath = QCoreApplication::applicationDirPath() + "/SaveDbFile/";
QString dbName = dbPath + QDate::currentDate().toString("yyyyMMdd") + ".db";
m_db = QSqlDatabase::addDatabase("QSQLITE");
m_db.setDatabaseName(dbName);
if(!m_db.open())
{
//打开失败打印
qDebug()<<"数据库打开失败..."<<m_db.lastError();
}
2.创建名为dataTable的数据表
QSqlQuery query(m_db);
QString createStr = "create table if not exists dataTable(id integer primary key autoincrement, data varchar(30), time datetime)";
query.exec(createStr);
3.向dataTable表中插入数据
QSqlQuery query(m_db);
query.prepare("insert into dataTable(data,time) values(:data,:time)"); //插入数据
query.bindValue(":data",data);
query.bindValue(":time",time);
query.exec();
1.MySqlite3.pro
QT += core gui sql
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++11
DEFINES += QT_DEPRECATED_WARNINGS
SOURCES += \
main.cpp \
mainwindow.cpp \
mysqlmodel.cpp
HEADERS += \
mainwindow.h \
mysqlmodel.h
FORMS += \
mainwindow.ui
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
2.mysqlmodel.h
#ifndef MYSQLMODEL_H
#define MYSQLMODEL_H
#include
class MySqlModel : public QSqlQueryModel
{
Q_OBJECT
public:
MySqlModel(QObject *parent = nullptr);
QVariant data(const QModelIndex &item, int role) const override;
};
#endif // MYSQLMODEL_H
3.mysqlmodel.cpp
#include "mysqlmodel.h"
MySqlModel::MySqlModel(QObject *parent)
: QSqlQueryModel(parent)
{
}
//设置文本居中
QVariant MySqlModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const
{
QVariant value = QSqlQueryModel::data(index,role);
if(role == Qt::TextAlignmentRole)
{
value = Qt::AlignCenter; //文本居中
return value;
}
return value;
}
4.mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
#include
#include
//#include
#include
#include
#include
#include "mysqlmodel.h"
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
void initWidget();
private slots:
void slot_writeDataToDb();
void on_cb_keepBottom_toggled(bool checked);
void on_pb_start_clicked();
void on_pb_stop_clicked();
void on_pb_change_clicked();
private:
Ui::MainWindow *ui;
bool m_keepFlag;
QTimer *m_timer;
QSqlDatabase m_db;
MySqlModel *m_model;
MySqlModel *m_model2;
};
#endif // MAINWINDOW_H
5.mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->initWidget();
}
MainWindow::~MainWindow()
{
delete ui;
m_db.close();
}
//初始化界面
void MainWindow::initWidget()
{
//初始化变量
m_keepFlag = false;
//以当天日期为名称创建数据库并打开
QString dbPath = QCoreApplication::applicationDirPath() + "/SaveDbFile/";
QString dbName = dbPath + QDate::currentDate().toString("yyyyMMdd") + ".db";
m_db = QSqlDatabase::addDatabase("QSQLITE");
m_db.setDatabaseName(dbName);
if(!m_db.open())
{
//打开失败打印
qDebug()<<"数据库打开失败..."<<m_db.lastError();
}
//创建名为dataTable的数据表
QSqlQuery query(m_db);
QString createStr = "create table if not exists dataTable(id integer primary key autoincrement, data varchar(30), time datetime)";
query.exec(createStr);
//创建名为dataTable2的数据表
QString createStr2 = "create table if not exists dataTable2(id integer primary key autoincrement, test varchar(30), data varchar(30), time datetime)";
query.exec(createStr2);
//初始化表格模型
m_model = new MySqlModel(this);
QString initStr = "select * from dataTable;"; //获取dataTable表所有数据
m_model->setQuery(initStr,m_db);
while(m_model->canFetchMore())
{
m_model->fetchMore(); //为了显示全部数据,不然会出现只显示在256条数据的问题
}
m_model->setHeaderData(0,Qt::Horizontal,"序号"); //修改表名,不改的话与创建时的表名对应
m_model->setHeaderData(1,Qt::Horizontal,"数据");
m_model->setHeaderData(2,Qt::Horizontal,"时间");
//初始化表格模型2
m_model2 = new MySqlModel(this);
QString initStr2 = "select * from dataTable2;"; //获取dataTable表所有数据
m_model2->setQuery(initStr2,m_db);
while(m_model2->canFetchMore())
{
m_model2->fetchMore(); //为了显示全部数据,不然会出现只显示在256条数据的问题
}
m_model2->setHeaderData(0,Qt::Horizontal,"序号");
m_model2->setHeaderData(1,Qt::Horizontal,"测试");
m_model2->setHeaderData(2,Qt::Horizontal,"数据");
m_model2->setHeaderData(3,Qt::Horizontal,"时间");
//设置表格属性,默认模型1
ui->tableView->setModel(m_model);
ui->tableView->horizontalHeader()->setStyleSheet("QHeaderView::section{background:white;color: black;}"); //区分列表头
ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows); //整行选中
ui->tableView->setSelectionMode(QAbstractItemView::SingleSelection); //单行选中
ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers); //设置只读
ui->tableView->verticalHeader()->hide(); //隐藏行头
ui->tableView->verticalHeader()->setDefaultSectionSize(33); //设置行宽
//ui->tableView->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch); //自适应行宽
ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); //自适应列度
ui->tableView->setShowGrid(true); //表格网格线显示
ui->tableView->setGridStyle(Qt::SolidLine); //网格线画笔
ui->tableView->setFocusPolicy(Qt::NoFocus); //去除选中时虚线框
ui->tableView->scrollToBottom(); //保持滚动条在底部
// 初始化定时器
m_timer = new QTimer(this);
connect(m_timer,SIGNAL(timeout()),this,SLOT(slot_writeDataToDb()));
}
//定时器槽,写入数据
void MainWindow::slot_writeDataToDb()
{
//获取当前时间和数据(这里模拟一个随机数)
QString data = QString::number(qrand());
QString time = QTime::currentTime().toString("hh:mm:ss");
//插入数据
QSqlQuery query(m_db);
query.prepare("insert into dataTable(data,time) values(:data,:time)"); //插入数据
query.bindValue(":data",data);
query.bindValue(":time",time);
query.exec();
//更新表格模型
QString initStr = "select * from dataTable;";
m_model->setQuery(initStr,m_db);
while(m_model->canFetchMore())
{
m_model->fetchMore(); //确保数据显示完全
}
//插入数据2
QSqlQuery query2(m_db);
query2.prepare("insert into dataTable2(test,data,time) values(:test,:data,:time)"); //插入数据
query2.bindValue(":test","测试文本");
query2.bindValue(":data",data);
query2.bindValue(":time",time);
query2.exec();
//更新表格模型2
QString initStr2 = "select * from dataTable2;";
m_model2->setQuery(initStr2,m_db);
while(m_model2->canFetchMore())
{
m_model2->fetchMore(); //确保数据显示完全
}
//保持滚动条在底部
if(m_keepFlag)
{
ui->tableView->scrollToBottom();
}
}
//保持底部勾选框
void MainWindow::on_cb_keepBottom_toggled(bool checked)
{
m_keepFlag = checked;
}
//定时器开始
void MainWindow::on_pb_start_clicked()
{
m_timer->start(1000); // 每秒执行一次
}
//定时器停止
void MainWindow::on_pb_stop_clicked()
{
m_timer->stop();
}
//切换数据表
void MainWindow::on_pb_change_clicked()
{
static bool changeFlag = true;
if(changeFlag)
{
changeFlag = false;
ui->tableView->setModel(m_model2);
}
else
{
changeFlag = true;
ui->tableView->setModel(m_model);
}
ui->tableView->scrollToBottom();
}
我的示例百度网盘链接:https://pan.baidu.com/s/17x9lUmWIWCvc8wJRw-5_jw
提取码:xxcj
本文示例中会以当天日期为名称自动创建数据库,并在其中创建了两个数据表,界面上通过点击切换数据表按钮来更换模型刷新显示,其中使用了一个定时器来模拟数据插入库中的操作,并且将数据库的内容实时显示在界面上,表格上的数据文本居中是通过自定义MySqlModel类来实现的,这里的话只用到了Sqlite数据库的插入和查询语句,也是比较简单的,对这些语句的详细介绍可以查看参考文章。
hello:
共同学习,共同进步,如果还有相关问题,可在评论区留言进行讨论。
参考文章:
SQLite教程
五分钟教会你在Qt中使用SQLite数据库,非常有用,建议收藏!
QT6数据库操作—修改QSqlQueryModel完成QTableView的显示样式