Qt连接Sqlite3并使用Qtableview实时显示数据,重写QSqlQueryModel实现文本居中 您所在的位置:网站首页 jquery连接sqlite3 Qt连接Sqlite3并使用Qtableview实时显示数据,重写QSqlQueryModel实现文本居中

Qt连接Sqlite3并使用Qtableview实时显示数据,重写QSqlQueryModel实现文本居中

2024-06-03 20:22| 来源: 网络整理| 查看: 265

系列文章目录

提示:这里是该系列文章的所有文章的目录 第一章: Qt连接Sqlite3并使用Qtableview实时显示数据,重写QSqlQueryModel实现文本居中 第二章: Qt下使用Sqlite数据库实现图片的读写显示

文章目录 系列文章目录前言一、引入SQL模块二、数据库的基本操作三、示例完整代码四、下载链接总结

前言

什么是 SQLite? SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库不一样,您不需要在系统中配置。(来自菜鸟教程SQLite简介)

在我以前的文章有介绍Qt下MySQL数据库的使用,需要进行MySQL服务器的连接,有时候还需要编译Qt源码来获取MySQL驱动,使用起来有点麻烦。如果我们的项目不需要一个单独的服务器进程或操作的系统(无服务器的),这时候可以选择使用SQLite数据库来保存数据,这里介绍一下Qt中自带驱动的Sqlite3数据库的使用,并结合相应的示例进行讲解,标题功能的体现见示例完整代码,如有错误之处,欢迎大家批评指正。

项目效果 请添加图片描述

提示:以下是本篇文章正文内容,下面案例可供参考

一、引入SQL模块

在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()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_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(); }

6.mainwindow.ui 请添加图片描述

四、下载链接

我的示例百度网盘链接:https://pan.baidu.com/s/17x9lUmWIWCvc8wJRw-5_jw 提取码:xxcj

总结

本文示例中会以当天日期为名称自动创建数据库,并在其中创建了两个数据表,界面上通过点击切换数据表按钮来更换模型刷新显示,其中使用了一个定时器来模拟数据插入库中的操作,并且将数据库的内容实时显示在界面上,表格上的数据文本居中是通过自定义MySqlModel类来实现的,这里的话只用到了Sqlite数据库的插入和查询语句,也是比较简单的,对这些语句的详细介绍可以查看参考文章。

hello: 共同学习,共同进步,如果还有相关问题,可在评论区留言进行讨论。

参考文章: SQLite教程 五分钟教会你在Qt中使用SQLite数据库,非常有用,建议收藏! QT6数据库操作—修改QSqlQueryModel完成QTableView的显示样式



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有