一、前言

在Qt与数据库结合编程的过程中,记录一多,基本上都需要用到翻页查看记录,翻页有个好处就是可以减轻显示数据的表格的压力,不需要一次性将数据库表的记录全部显示,也基本上没有谁在一页上需要一次性显示所有记录,搜索引擎搜索出来的结果也基本上都是翻页显示的,那么问题来了,有没有一种通用的办法可以只需要传入表名和查询条件自动翻页呢,答案是肯定的,Qt对数据库操作的封装也是相当完美的,显示也是如此,为此特意封装成了一个类,直接用就行。

主要功能:

  1. 自动按照设定的每页多少行数据分页
  2. 只需要传入表名/字段集合/每页行数/翻页指示按钮/文字指示标签
  3. 提供公共静态方法绑定字段数据到下拉框
  4. 建议条件字段用数字类型的主键,速度极快
  5. 增加线程查询符合条件的记录总数,数据量巨大时候不会卡主界面
  6. 提供查询结果返回信号,包括当前页/总页数/总记录数/查询用时
  7. 可设置所有列或者某一列对齐样式例如居中或者右对齐
  8. 可设置增加一列,列的位置,标题,宽度
  9. 可设置要查询的字段集合

二、代码思路

void DbPage::bindData(const QString &sql)
{
queryModel->setQuery(sql, QSqlDatabase::database(connName));
tableView->setModel(queryModel); //依次设置列标题列宽
int columnCount = tableView->model()->columnCount();
int nameCount = columnNames.count();
columnCount = columnCount > nameCount ? nameCount : columnCount; QList<QString> columnNames = this->columnNames;
QList<int> columnWidths = this->columnWidths; //根据设置添加新列,将对应新列的标题名称和宽度按照索引位置插
if (insertColumnIndex >= 0) {
columnCount++;
columnNames.insert(insertColumnIndex, insertColumnName);
columnWidths.insert(insertColumnIndex, insertColumnWidth);
queryModel->insertColumn(insertColumnIndex);
} //设置列标题和列宽度
for (int i = 0; i < columnCount; i++) {
queryModel->setHeaderData(i, Qt::Horizontal, columnNames.at(i));
tableView->setColumnWidth(i, columnWidths.at(i));
} if (labPageCurrent != 0) {
labPageCurrent->setText(QString("第 %1 页").arg(pageCurrent));
} if (labPageCount != 0) {
labPageCount->setText(QString("共 %1 页").arg(pageCount));
} if (labResultCount != 0) {
labResultCount->setText(QString("共 %1 条").arg(resultCount));
} if (labResultCurrent != 0) {
labResultCurrent->setText(QString("每页 %1 条").arg(resultCurrent));
} if (labInfo != 0) {
labInfo->setText(QString("共 %1 条 每页 %2 条 共 %3 页 第 %4 页").arg(resultCount).arg(resultCurrent).arg(pageCount).arg(pageCurrent));
} //发送结果信号
emit receivePage(pageCurrent, pageCount, resultCount, resultCurrent);
} void DbPage::slot_receiveCount(quint32 count, double msec)
{
if (labResult != 0) {
labResult->setText(QString("查询用时 %1 秒").arg(QString::number(msec / 1000, 'f', 3)));
} resultCount = count; int yushu = resultCount % resultCurrent; //不存在余数,说明是整行,例如300%5==0
if (yushu == 0) {
if (resultCount > 0 && resultCount < resultCurrent) {
pageCount = 1;
} else {
pageCount = resultCount / resultCurrent;
}
} else {
pageCount = (resultCount / resultCurrent) + 1;
} //2014-10-9增加翻页按钮可用不可用处理,如果只有一页数据,则翻页按钮不可用
if (pageCount <= 1) {
btnFirst->setEnabled(false);
btnLast->setEnabled(false);
btnNext->setEnabled(false);
btnPre->setEnabled(false);
} else {
btnFirst->setEnabled(true);
btnLast->setEnabled(true);
btnNext->setEnabled(true);
btnPre->setEnabled(true);
} tempSql = QString("select %1 from %2 %3 order by %4").arg(selectColumn).arg(tableName).arg(whereSql).arg(orderSql);
sql = QString("%1 limit %2,%3;").arg(tempSql).arg(startIndex).arg(resultCurrent); //组织分页SQL语句 bindData(sql);
} void DbPage::first()
{
if (pageCount > 1) {
startIndex = 0;
pageCurrent = 1;
sql = QString("%1 limit %2,%3;").arg(tempSql).arg(startIndex).arg(resultCurrent);
bindData(sql);
btnLast->setEnabled(true);
btnNext->setEnabled(true);
} btnFirst->setEnabled(false);
btnPre->setEnabled(false);
} void DbPage::previous()
{
if (pageCurrent > 1) {
pageCurrent--;
startIndex -= resultCurrent;
sql = QString("%1 limit %2,%3;").arg(tempSql).arg(startIndex).arg(resultCurrent);
bindData(sql);
btnLast->setEnabled(true);
btnNext->setEnabled(true);
} if (pageCurrent == 1) {
btnFirst->setEnabled(false);
btnPre->setEnabled(false);
}
} void DbPage::next()
{
if (pageCurrent < pageCount) {
pageCurrent++;
startIndex += resultCurrent;
sql = QString("%1 limit %2,%3;").arg(tempSql).arg(startIndex).arg(resultCurrent);
bindData(sql);
btnFirst->setEnabled(true);
btnPre->setEnabled(true);
} if (pageCurrent == pageCount) {
btnLast->setEnabled(false);
btnNext->setEnabled(false);
}
} void DbPage::last()
{
if (pageCount > 0) {
startIndex = (pageCount - 1) * resultCurrent;
pageCurrent = pageCount;
sql = QString("%1 limit %2,%3;").arg(tempSql).arg(startIndex).arg(resultCurrent);
bindData(sql);
btnFirst->setEnabled(true);
btnPre->setEnabled(true);
} btnLast->setEnabled(false);
btnNext->setEnabled(false);
}

三、效果图

四、开源主页

  • 以上作品完整源码下载都在开源主页,会持续不断更新作品数量和质量,欢迎各位关注。
  • 本开源项目已经成功升级到V2.0版本,分门别类,图文并茂,保你爽到爆。
  • Qt开源武林秘籍开发经验,看完学完,20K起薪,没有找我!
  1. 国内站点:https://gitee.com/feiyangqingyun/QWidgetDemo
  2. 国际站点:https://github.com/feiyangqingyun/QWidgetDemo
  3. 开源秘籍:https://gitee.com/feiyangqingyun/qtkaifajingyan
  4. 个人主页:https://qtchina.blog.csdn.net/
  5. 知乎主页:https://www.zhihu.com/people/feiyangqingyun/

Qt开源作品19-通用数据库翻页查询的更多相关文章

  1. selenium 之百度搜索,结果列表翻页查询

    selenium之百度搜索,结果列表翻页查询 by:授客 QQ:1033553122 实例:百度搜索,结果列表翻页查询 解决问题:解决selenium driver获取web页面元素时,元素过期问题 ...

  2. 开源 侧滑 和 Tab滑动翻页 控件

    侧滑 https://github.com/jfeinstein10/SlidingMenu Tab滑动翻页 https://github.com/astuetz/PagerSlidingTabStr ...

  3. MySQL翻页查询技巧

    在查询大量数据库,一般都会采用翻页.自然会想到offset跟limit. 今天知道了一个技巧,用id查询.因为id是主键,查起来很快. 思路是:给id一个区间做where条件,将数据分隔成几份,然后每 ...

  4. mysql实战优化之二:limit优化(大表翻页查询时) sql优化

    mysql的表test中有20105119行数据.建立索引:data_status,place_cargo_status 场景1: SELECT id, resource_id, resource_t ...

  5. Qt开源作品38-无边框窗体方案(无抖动,支持win、linux、mac等系统,侧边半屏顶部全屏)

    一 前言 不知道各位程序员有没有遇到过这样一种困惑,好不容易在开源网站找到了类似的想要的项目代码,结果down下来一编译,我勒个去,几百个错误,根本没法用,熟悉的人还好可以直接阅读代码进行修改(有些只 ...

  6. MySql翻页查询

    分页查询在网页中随处可见,那原理是什么呢?下面简单介绍一下基于MySql数据库的limit实现方法. 首先明确为什么要使用分页查询,因为数据庞大,查询不可能全部显示在页面上,如果全部显示在页面上,也会 ...

  7. centos中less翻页查询的用法

    用法实例: cat 21342.log | less

  8. 数据库MySQL--分页查询

    应用场景:当显示的数据一页无法全部显示,则需要分页提交sql请求 语法: select 查询列表 from 表 {    (join type)join 表2 on 连接条件 where 筛选条件 g ...

  9. mysql快速翻页查询方法

    SELECT SQL_NO_CACHE *FROM softdb_testWHERE id > (SELECT idFROM softdb_testORDER BY id DESCLIMIT 5 ...

  10. Atitit.列表页面and条件查询的实现最佳实践(2)------翻页 分页 控件的实现java .net php

    )------翻页 分页 控件的实现java .net php 1. 关于翻页有关的几大控件::搜索框控件,显示表格控件,翻页器,数据源控件.. 1 2. 翻页的显示格式:: 1 2.1. 通常ui- ...

随机推荐

  1. Android复习(二)应用资源 --> 动画

    没什么好总结的 复制自 https://developer.android.google.cn/guide/topics/resources/animation-resource 有需要的可以查看官方 ...

  2. KubeSphere 宣布开源 Thanos 的企业级发行版 Whizard

    日前,青云科技宣布开源 Thanos 的企业级发行版 Whizard,为企业带来真正高可用.可扩展.可存储与查询海量监控数据.易运维.安全的 Prometheus 长期存储方案. Prometheus ...

  3. KubeKey 2.0.0 发布:让离线部署 K8s 更加便捷

    2022 年 3 月 8 日,KubeKey 2.0.0 正式发布,这是 KubeKey 的第 7 个正式版本,也是非常重要的一个版本.该版本新增了清单(manifest)和制品(artifact)的 ...

  4. .NET使用OllamaSharp实现大模型推理对话的简单演示

      前提条件:请确保你本地已经安装了ollama以及有关本地离线模型.或者已有远程模型环境等.如果没有,请自行部署.如果需要帮助,可以文末获取联系方式咨询.由于部署离线大模型过于简单,在线资料也很多, ...

  5. vue搜索历史记录缓存实现

    思路: 1.浏览器缓存永久保存搜索历史数据. 2.页面初始化将数据保存到页面变量中. 3.对搜索历史记录的怎加和删除,要同步到缓存中. ----------------直接看代码----------- ...

  6. 哈希表(C语言实现)

    在计算机世界中,哈希表如同一位聪慧的图书管理员.他知道如何计算索书号,从而可以快速找到目标图书. 文章目录 1.哈希表的概念 1.1哈希表的基本操作 1.2哈希表的常用操作 2.基于数实现哈希表 2. ...

  7. Protues中51单片机按键无法复位(已解决)

    前言 昨晚用 Protues 搭建了 51 的最小系统电路,在实物中好用的复位电路,到仿真里不能正常复位了. 51 单片机是高电平复位,所以在运行时 RST 引脚应该是低电平,但在仿真中 RST 引脚 ...

  8. Mysql(2)—SQL语法详解(通俗易懂)

    一.关于SQL 1.1 简介 SQL(Structured Query Language,结构化查询语言)是一种用于管理关系型数据库的标准编程语言.它主要用于数据的查询.插入.更新和删除等操作.SQL ...

  9. oracle查询是否锁表以及解锁语句

    --锁表语句 SELECT b.owner, b.object_name, a.session_id, a.locked_mode FROM v$locked_object a, dba_object ...

  10. NewStar CTF 2024 Crypto

    Week1 xor #As a freshman starting in 2024, you should know something about XOR, so this task is for ...