一、前言

数据库分页展示,在所有的涉及到数据库记录的项目中都是需要的,除了简单的设备信息表、用户信息表这种很少几条几十条数据量的表除外,其余的日志记录表等都需要分页展示数据,少量的数据可以滚动条下拉查看完,超过百条以上的一般建议要加上分页的功能处理,不然用户查看起来明显不舒服,体验不友好,最明显的例子就是网页的搜索结果,一次性展示上万条,不仅是多余的增加了查询的压力,而且用户往往只关注最前面的几页记录,再比如查询报警记录,一般是按照时间降序排序,最近最新的报警记录显示在最前面,用户最关心的也就是最前面的结果。

数据库分页一般是通过sql语句的limit去处理,根据用户选择的条件构建sql语句传入数据库执行,每当单击上一页、下一页、第一页、末一页等按钮的时候,也是重新执行了sql语句返回结果。最开始这个数据库分页类是将分页按钮都集中在一起,后面单独拆分了出来,逻辑代码一个类,界面单独成分页导航控件专门展示UI外观,这个外观可以设置各种颜色和样式等。

数据库通用翻页类特点:

  1. 可设置每页多少行记录,自动按照设定的值进行分页。
  2. 可设置要查询的表名、字段集合、条件语句、排序语句。
  3. 可设置第一页、上一页、下一页、末一页、翻页按钮。
  4. 可设置当前页、总页数、总记录数、每页记录数、查询用时标签页。
  5. 多线程查询总记录数,数据量巨大时候不会卡主界面。
  6. 建议条件字段用整型类型的主键,速度极快。
  7. 提供查询结果返回信号,包括当前页、总页数、总记录数、查询用时等信息。
  8. 可设置所有列或者某一列对齐样式例如居中或者右对齐。
  9. 可增加列用于标识该条记录,设定列的位置、标题、宽度。
  10. 提供函数直接执行第一页、上一页、下一页、末一页。
  11. 提供函数直接跳转到指定页。
  12. 根据是否第一页、末一页自动禁用对应的按钮。
  13. 本控件是翻页功能类,和翻页控件navpage完美搭配,形成超级牛逼的翻页控件。

分页导航控件特点:

  1. 可设置页码按钮的个数。
  2. 可设置字体大小。
  3. 可设置边框圆角角度、大小、颜色。
  4. 可设置正常状态背景颜色、文字颜色。
  5. 可识别悬停状态背景颜色、文字颜色。
  6. 可设置按下状态背景颜色、文字颜色。
  7. 可设置选中状态背景颜色、文字颜色。
  8. 可设置导航位置居中对齐、左对齐、右对齐。
  9. 可设置是否显示提示标签控件。
  10. 自动计算总页码数显示隐藏多余按钮。
  11. 自动计算切换页码导航。
  12. 和分页导航功能类无缝对接完美融合。

关于Qt数据库相关开发的一些经验总结:

https://qtchina.blog.csdn.net/article/details/119022424

二、功能特点

  1. 同时支持多种数据库比如odbc、sqlite、mysql、postgresql、sqlserver、oracle、人大金仓等。
  2. 一个数据库类即可管理本地数据库通信,也支持远程数据库通信等。
  3. 数据库线程支持执行各种sql语句,包括单条和批量。
  4. 组件中的所有类打印信息、错误信息、执行结果都信号发出去。
  5. 集成数据库通用翻页类(负责具体处理逻辑),搭配分页导航控件(负责外观),形成超级牛逼的翻页控件。
  6. 集成数据库自动清理类,设定最大记录数后台自动清理早期数据。
  7. 集成自定义委托类,支持复选框、文本框、下拉框、日期框、微调框、进度条等。
  8. 同时支持Qt4-Qt6,亲测Qt4.6到Qt6.3任意版本,任意系统和编译器。
  9. 本组件无故障 360天7乘24小时 运行在至少上万个现场,商业级别品质保证。
  10. 每个类都对应完整详细的使用示例,注释详细,非常适合阅读学习。
  11. 可以作为独立的程序运行,比如自动清理早期数据,同步数据到云端。
  12. 全部线程处理,不卡界面,自动重连数据库。
  13. 普通测试情况,sqlite数据库,数据库发生器每秒钟插入1000条记录约0.003秒钟,同时自动清理数据类每秒钟删除1000条记录约0.13秒,不同线程互不干扰。

三、体验地址

  1. 体验地址:https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A 提取码:o05q 文件名:bin_dbtool.zip
  2. 国内站点:https://gitee.com/feiyangqingyun
  3. 国际站点:https://github.com/feiyangqingyun
  4. 个人主页:https://blog.csdn.net/feiyangqingyun
  5. 知乎主页:https://www.zhihu.com/people/feiyangqingyun/

四、效果图

五、相关代码

#include "frmdbpage.h"
#include "ui_frmdbpage.h"
#include "quihelper.h"
#include "dbconnthread.h"
#include "dbpage.h"
#include "dbdelegate.h" frmDbPage::frmDbPage(QWidget *parent) : QWidget(parent), ui(new Ui::frmDbPage)
{
ui->setupUi(this);
this->initForm();
this->initConfig();
} frmDbPage::~frmDbPage()
{
delete ui;
} void frmDbPage::initForm()
{
ui->frame->setFixedWidth(AppConfig::RightWidth);
QUIHelper::initTableView(ui->tableView); //实例化数据库通信类
dbConn = new DbConnThread(this);
dbConn->setDbFlag("分页"); //实例化翻页类
dbPage = new DbPage(this);
//关联查询记录总数
connect(dbConn, SIGNAL(receiveCount(QString, int, int)), dbPage, SLOT(receiveCount(QString, int, int))); dbPage->setAllCenter(true);
dbPage->setRecordsPerpage(30);
dbPage->setWhereSql("where 1=1"); //分页导航控件
connect(ui->navPage, SIGNAL(selectPage(int)), dbPage, SLOT(selectPage(int)));
connect(dbPage, SIGNAL(receivePage(quint32, quint32, quint32, quint32)),
ui->navPage, SLOT(receivePage(quint32, quint32, quint32, quint32)));
QLabel *labInfo = ui->navPage->getLabInfo();
QList<QPushButton *> btns = ui->navPage->getBtnAll();
dbPage->setControl(ui->tableView, ui->labPageTotal, 0, ui->labRecordsTotal, 0, ui->labSelectTime,
labInfo, btns.at(0), btns.at(1), btns.at(2), btns.at(3)); //采用系统默认的样式并设置按钮固定尺寸
ui->navPage->setShowStyle(false);
ui->navPage->setShowGoPage(true);
foreach (QPushButton *btn, btns) {
btn->setFixedWidth(50);
}
} void frmDbPage::initConfig()
{
ui->cboxDbType->addItems(DbHelper::getDbType());
ui->cboxDbType->setCurrentIndex(ui->cboxDbType->findText(AppConfig::DbType4));
connect(ui->cboxDbType, SIGNAL(currentIndexChanged(int)), this, SLOT(saveConfig())); ui->txtDbName->setText(AppConfig::DbName4);
connect(ui->txtDbName, SIGNAL(textChanged(QString)), this, SLOT(saveConfig())); ui->txtHostName->setText(AppConfig::HostName4);
connect(ui->txtHostName, SIGNAL(textChanged(QString)), this, SLOT(saveConfig())); ui->txtHostPort->setText(QString::number(AppConfig::HostPort4));
connect(ui->txtHostPort, SIGNAL(textChanged(QString)), this, SLOT(saveConfig())); ui->txtUserName->setText(AppConfig::UserName4);
connect(ui->txtUserName, SIGNAL(textChanged(QString)), this, SLOT(saveConfig())); ui->txtUserPwd->setText(AppConfig::UserPwd4);
connect(ui->txtUserPwd, SIGNAL(textChanged(QString)), this, SLOT(saveConfig())); ui->txtColumnName->setText(AppConfig::ColumnName4);
connect(ui->txtColumnName, SIGNAL(textChanged()), this, SLOT(saveConfig())); ui->txtColumnWidth->setText(AppConfig::ColumnWidth4);
connect(ui->txtColumnWidth, SIGNAL(textChanged()), this, SLOT(saveConfig())); ui->txtCountName->setText("LogID");
ui->txtOrderSql->setText("LogID asc");
} void frmDbPage::saveConfig()
{
AppConfig::DbType4 = ui->cboxDbType->currentText();
AppConfig::DbName4 = ui->txtDbName->text();
AppConfig::HostName4 = ui->txtHostName->text();
AppConfig::HostPort4 = ui->txtHostPort->text().toInt();
AppConfig::UserName4 = ui->txtUserName->text();
AppConfig::UserPwd4 = ui->txtUserPwd->text(); AppConfig::ColumnName4 = ui->txtColumnName->toPlainText();
AppConfig::ColumnWidth4 = ui->txtColumnWidth->toPlainText();
AppConfig::writeConfig();
} void frmDbPage::on_btnOpen_clicked()
{
if (ui->btnOpen->text() == "打开数据库") {
DbInfo dbInfo;
dbInfo.connName = this->objectName();
dbInfo.dbName = AppConfig::DbName4;
dbInfo.hostName = AppConfig::HostName4;
dbInfo.hostPort = AppConfig::HostPort4;
dbInfo.userName = AppConfig::UserName4;
dbInfo.userPwd = AppConfig::UserPwd4; QString dbType = AppConfig::DbType4.toUpper();
if (dbType == "SQLITE") {
dbInfo.dbName = DbHelper::getDbDefaultFile();
} dbConn->setConnInfo(DbHelper::getDbType(dbType), dbInfo);
if (dbConn->openDb()) {
dbConn->start();
ui->btnOpen->setText("关闭数据库");
} else {
QString error = dbConn->getDatabase().lastError().text();
QUIHelper::showMessageBoxError("打开数据库失败!\n" + error, 3);
}
} else {
dbConn->stop();
dbConn->closeDb();
ui->btnOpen->setText("打开数据库");
dbPage->clear();
} QTimer::singleShot(100, this, SLOT(getTables()));
QTimer::singleShot(1000, this, SLOT(on_btnDo_clicked()));
} void frmDbPage::on_btnCopy_clicked()
{
//将数据库设置参数一键粘贴过来
ui->cboxDbType->setCurrentIndex(ui->cboxDbType->findText(AppConfig::LocalDbType));
ui->txtDbName->setText(AppConfig::LocalDbName);
ui->txtHostName->setText(AppConfig::LocalHostName);
ui->txtHostPort->setText(QString::number(AppConfig::LocalHostPort));
ui->txtUserName->setText(AppConfig::LocalUserName);
ui->txtUserPwd->setText(AppConfig::LocalUserPwd);
} void frmDbPage::getTables()
{
if (!dbConn->getOk()) {
return;
} //取出数据库对应的表集合
QStringList tables = dbConn->getDatabase().tables();
ui->cboxTables->clear();
ui->cboxTables->addItems(tables);
if (tables.contains("LogInfo")) {
ui->cboxTables->setCurrentIndex(ui->cboxTables->findText("LogInfo"));
}
} void frmDbPage::on_btnDo_clicked()
{
if (!dbConn->getOk()) {
return;
} //表格字段 名称+宽度
QList<QString> columnNames = AppConfig::ColumnName4.split(",");
QList<int> columnWidths;
QStringList listWidth = AppConfig::ColumnWidth4.split(",");
foreach (QString width, listWidth) {
columnWidths << width.toInt();
} //具体函数解释参见对应类头文件
//不设置字段中文名和宽度也行,默认取数据库字段名
dbPage->setColumnNames(columnNames);
dbPage->setColumnWidths(columnWidths); dbPage->setDbType(AppConfig::DbType4);
dbPage->setConnName(dbConn->getDatabase().connectionName()); QString tableName = ui->cboxTables->currentText();
QString countName = ui->txtCountName->text();
QString orderSql = ui->txtOrderSql->text();
dbPage->setTableName(tableName);
dbPage->setOrderSql(orderSql); dbPage->select();
dbConn->selectCount(tableName, countName, "where 1=1");
} void frmDbPage::on_cboxTables_currentIndexChanged(int)
{
QString table = ui->cboxTables->currentText();
QSqlRecord records = dbConn->getDatabase().record(table);
ui->cboxRecords->clear();
for (int i = 0; i < records.count(); ++i) {
ui->cboxRecords->addItem(records.fieldName(i));
}
} void frmDbPage::on_cboxRecords_currentIndexChanged(int)
{
QString record = ui->cboxRecords->currentText();
ui->txtCountName->setText(record);
ui->txtOrderSql->setText(record + " asc");
}

Qt数据库应用13-通用数据库分页的更多相关文章

  1. 用Java实现异构数据库的高效通用分页查询功能

    不同数据库的分页查询语句有着较大区别,其中MySQL数据的limit offset语法最为简单,而SQL Server数据库和Oracle数据库的分页就比较复杂了. 网上常见的SQL Server和O ...

  2. activiti5.13 框架 数据库设计说明书

    转载自:http://www.cnblogs.com/llzgzljl/p/3356108.html activiti5.13 框架 数据库设计说明书 1.结构设计 1.1.    逻辑结构设计 Ac ...

  3. DataAccess通用数据库访问类,简单易用,功能强悍

    以下是我编写的DataAccess通用数据库访问类,简单易用,支持:内联式创建多个参数.支持多事务提交.支持参数复用.支持更换数据库类型,希望能帮到大家,若需支持查出来后转换成实体,可以自行扩展dat ...

  4. 通用数据库操作类,前端easyui-datagrid,form

    实现功能:     左端datagrid显示简略信息,右侧显示选中行详细信息,数据库增删改 (1)点击选中行,右侧显示详细信息,其中[新增].[修改].[删除]按钮可用,[保存]按钮禁用 (2)点击[ ...

  5. Django数据操作F和Q、model多对多操作、Django中间件、信号、读数据库里的数据实现分页

    models.tb.objects.all().using('default'),根据using来指定在哪个库里查询,default是settings中配置的数据库的连接名称. 外话:django中引 ...

  6. Qt for Android 打包 SQLite 数据库

    Qt for Android 调用 SQLite 数据库时, 怎样将已经存在的数据库附加到 APK 中? 直接在你项目里面的Android源码的根目录下新建一个文件夹assets, 数据库就可以放里面 ...

  7. 一个通用数据库访问类(C#,SqlClient)

    本文转自:http://www.7139.com/jsxy/cxsj/c/200607/114291.html使用ADO.NET时,每次数据库操作都要设置connection属性.建立connecti ...

  8. SQL Server中通用数据库角色权限处理

    SQL Server中通用数据库角色权限处理   最近和同事在做数据库权限清理的事情,主要是删除一些账号:取消一些账号的较大的权限等,例如,有一些有db_owner权限,我们取消账号的数据库角色db_ ...

  9. C# 通用数据库配置界面,微软原生DLL重整合

    C# 通用数据库配置界面,微软原生DLL重整合 自己整合了 微软自带的数据连接配置界面对话库    Microsoft.Data.ConnectionUI.Dialog.dll  微软自带的数据连接配 ...

  10. VB通用数据库操作方法

    1.VB通用数据操作方法. 2.通用数据库查询方法. 3.通用数据库操作方法. 'ERP查询数据库 Public Function YZQuery(sqls As String, msgstring ...

随机推荐

  1. Vue3的生命周期函数

        选项式 API 组合式API beforeCreate 不需要 created  不需要 beforeMount onBeforeMount mounted onMounted beforeU ...

  2. 怎么封装一个vue的自定义指令

    自定义指令分为 全局和局部的指令 : 1. 自定义全局指令: 在 mian.js 中 ,使用 Vue.directive('指令名' ,  配置对象 ) 2. 局部自定义指令 在组件中使用 direc ...

  3. kotlin更多语言结构——>异常

    异常类 Kotlin 中所有异常类都是 Throwable 类的子孙类.每个异常都有消息.堆栈回溯信息以及可选的原因 使用 throw-表达式来抛出异常 throw Exception("H ...

  4. ABC270-d

    题目 首先贪心是行不通的,考试的时候打了贪心,挂了...... 举个反例: 10 2 3 4 贪心枚举答案为4,但若高桥先选3,最大值为6. 其实考试的时候想到了dp,但是不会打 悲 因为青木也是聪明 ...

  5. KubeKey 升级 Kubernetes 次要版本实战指南

    作者:运维有术 前言 知识点 定级:入门级 KubeKey 如何升级 Kubernetes 次要版本 Kubernetes 升级准备及验证 KubeKey 升级 Kubernetes 的常见问题 实战 ...

  6. Windows10关闭系统自动更新--专业版

    当你正在跑项目,cpu负荷,内存负荷,这时候Windows服务模块没有人情味滴突然来个更新撑爆你的磁盘读写,那感觉简直炸锅 像这样: 什么?加个固态就好了 你要是上了固态,就不应该看到这篇文章,相见即 ...

  7. vite 设置网络代理

    参考文档:vite 官网.node-http-proxy 完整示例: export default defineConfig({ server: { proxy: { // 字符串简写写法 '/foo ...

  8. 题解:USACO23OPEN-Silver

    题解:USACO23OPEN-Silver T1 Milk Sum 给定一个长度为 \(N\) 的序列 \(a_1,a_2,...,a_n\),现在给出 \(Q\) 次操作每次将 \(a_x\) 修改 ...

  9. quartz集群增强版🎉

    quartz集群增强版 转载请著名出处https://www.cnblogs.com/funnyzpc/p/18534034 这是除了mee_admin之外,投入时间精力最多的一次开源了,quartz ...

  10. games101_Homework1

    本次作业的任务是填写一个旋转矩阵和一个透视投影矩阵.给定三维下三个 点 v0(2.0, 0.0, −2.0), v1(0.0, 2.0, −2.0), v2(−2.0, 0.0, −2.0), 你需要 ...