《QT实用小工具·八》数据库通用翻页类

news2024/11/24 12:51:29

1、概述
源码放在文章末尾

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

下面是demo演示:
在这里插入图片描述

项目部分代码如下所示:

#ifndef DBPAGE_H
#define DBPAGE_H

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

#include <QtGui>
#include <QtSql>
#if (QT_VERSION >= QT_VERSION_CHECK(5,0,0))
#include <QtWidgets>
#endif

//自定义模型设置列居中和右对齐
class SqlQueryModel: public QSqlQueryModel
{
public:
    explicit SqlQueryModel(QObject *parent = 0);

protected:
    QVariant data(const QModelIndex &index, int role) const;

private:
    bool allCenter;                 //所有居中
    QList<int> alignCenterColumn;   //居中对齐列
    QList<int> alignRightColumn;    //右对齐列

public:
    //设置所有列居中
    void setAllCenter(bool allCenter);
    //设置居中对齐列索引集合
    void setAlignCenterColumn(const QList<int> &alignCenterColumn);
    //设置右对齐列索引集合
    void setAlignRightColumn(const QList<int> &alignRightColumn);
};

//计算复合条件的记录总行数,以便分页
class DbCountThread : public QThread
{
    Q_OBJECT
public:
    explicit DbCountThread(QObject *parent = 0);

private:
    QString connName;   //数据库连接名称
    QString sql;        //要执行的查询语句

protected:
    void run();

signals:
    void receiveCount(quint32 count, double msec);

public slots:
    //设置数据库连接名称
    void setConnName(const QString &connName);
    //设置要执行的查询语句
    void setSql(const QString &sql);
    //查询行数
    void select();
};

class DbPage : public QObject
{
    Q_OBJECT
public:
    enum DbType {
        DbType_ODBC = 0,        //odbc数据源
        DbType_Sqlite = 1,      //sqlite数据库
        DbType_MySql = 2,       //mysql数据库
        DbType_PostgreSQL = 3,  //postgresql数据库
        DbType_SqlServer = 4,   //sqlserver数据库
        DbType_Oracle = 5,      //oracle数据库
        DbType_KingBase = 6,    //人大金仓数据库
        DbType_Other = 255      //其他数据库
    };

    explicit DbPage(QObject *parent = 0);

    //绑定数据到下拉框
    static void bindData(const QString &columnName, const QString &orderColumn, const QString &tableName,
                         QComboBox *cbox, const QString &connName = "qt_sql_default_connection");
    static void bindData(const QString &columnName, const QString &orderColumn, const QString &tableName,
                         QList<QComboBox *> cboxs, const QString &connName = "qt_sql_default_connection");

private:
    int startIndex;             //分页开始索引,每次翻页都变动
    SqlQueryModel *queryModel;  //查询模型

    QLabel *labPageTotal;       //总页数标签
    QLabel *labPageCurrent;     //当前页标签
    QLabel *labRecordsTotal;    //总记录数标签
    QLabel *labRecordsPerpage;  //每页记录数标签
    QLabel *labSelectTime;      //显示查询用时标签
    QLabel *labSelectInfo;      //总页数当前页总记录数每页记录数

    QTableView *tableView;      //显示数据的表格对象
    QAbstractButton *btnFirst;  //第一页按钮对象
    QAbstractButton *btnPrevious;//上一页按钮对象
    QAbstractButton *btnNext;   //下一页按钮对象
    QAbstractButton *btnLast;   //末一页按钮对象

    QString countName;          //统计表行数用字段
    QString connName;           //所使用的数据库连接名
    DbType dbType;              //数据库类型

    quint32 pageCurrent;        //当前第几页
    quint32 pageTotal;          //总页数
    quint32 recordsTotal;       //总记录数
    quint32 recordsPerpage;     //每页显示记录数

    QString tableName;          //表名
    QString selectColumn;       //要查询的字段集合
    QString orderSql;           //排序语句
    QString whereSql;           //条件语句
    QList<QString> columnNames; //列名集合
    QList<int> columnWidths;    //列宽集合

    int insertColumnIndex;      //插入的列的索引位置
    QString insertColumnName;   //插入的列的标题
    int insertColumnWidth;      //插入的列的宽度

private slots:
    //绑定sql语句到表格
    void bindData(const QString &sql);
    //生成分页sql语句
    QString getPageSql();

    //收到记录行数
    void slot_receiveCount(quint32 count, double msec);

signals:
    //将翻页后的页码信息发出去可能其他地方要用到
    void receivePage(quint32 pageCurrent, quint32 pageTotal, quint32 recordsTotal, quint32 recordsPerpage);
    void receiveCount(quint32 count, double msec);

public slots:
    //设置需要显示数据的表格,数据翻页对应的按钮
    void setControl(QTableView *tableView,
                    QLabel *labPageTotal, QLabel *labPageCurrent,
                    QLabel *labRecordsTotal, QLabel *labRecordsPerpage,
                    QLabel *labSelectTime, QLabel *labSelectInfo,
                    QAbstractButton *btnFirst, QAbstractButton *btnPrevious,
                    QAbstractButton *btnNext, QAbstractButton *btnLast,
                    const QString &countName, const QString &connName = "qt_sql_default_connection");
    void setControl(QTableView *tableView,
                    QLabel *labPageTotal, QLabel *labPageCurrent,
                    QLabel *labRecordsTotal, QLabel *labRecordsPerpage,
                    QLabel *labSelectTime, QLabel *labSelectInfo,
                    const QString &countName, const QString &connName = "qt_sql_default_connection");
    void setControl(QTableView *tableView,
                    QAbstractButton *btnFirst, QAbstractButton *btnPrevious,
                    QAbstractButton *btnNext, QAbstractButton *btnLast,
                    const QString &countName, const QString &connName = "qt_sql_default_connection");
    void setControl(QTableView *tableView,
                    const QString &countName, const QString &connName = "qt_sql_default_connection");

    //设置数据库连接名称
    void setConnName(const QString &connName);
    //设置数据库类型
    void setDbType(const DbType &dbType);

    //设置要查询的表名
    void setTableName(const QString &tableName);
    //设置要查询的字段列名集合
    void setSelectColumn(const QString &selectColumn);

    //设置排序sql
    void setOrderSql(const QString &orderSql);
    //设置条件sql
    void setWhereSql(const QString &whereSql);

    //设置每页显示多少行数据
    void setRecordsPerpage(int recordsPerpage);
    //设置列名称集合
    void setColumnNames(const QList<QString> &columnNames);
    //设置列宽度集合
    void setColumnWidths(const QList<int> &columnWidths);

    //设置所有列居中
    void setAllCenter(bool allCenter);
    //设置居中对齐列索引集合
    void setAlignCenterColumn(const QList<int> &alignCenterColumn);
    //设置右对齐列索引集合
    void setAlignRightColumn(const QList<int> &alignRightColumn);

    //设置插入的列的索引
    void setInsertColumnIndex(int insertColumnIndex);
    //设置插入的列的标题
    void setInsertColumnName(const QString &insertColumnName);
    //设置插入的列的宽度
    void setInsertColumnWidth(int insertColumnWidth);

    //根据首页末页禁用按钮
    void changeBtnEnable();
    //执行查询
    void select();
    //指定页跳转
    void selectPage(int page);

    //翻页 第一页+上一页+下一页+末一页
    void first();
    void previous();
    void next();
    void last();
};

#endif // DBPAGE_H

源码下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1564662.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

37.HarmonyOS鸿蒙系统 App(ArkUI) 创建第一个应用程序hello world

HarmonyOS App(ArkUI) 创建第一个应用程序helloworld 线性布局 1.鸿蒙应用程序开发app_hap开发环境搭建 3.DevEco Studio安装鸿蒙手机app本地模拟器 打开DevEco Studio,点击文件-》新建 双击打开index.ets 复制如下代码&#xff1a; import FaultLogger from ohos.faultL…

SpringBoot+ECharts+Html 字符云/词云案例详解

1. 技术点 SpringBoot、MyBatis、thymeleaf、MySQL、ECharts 等 2. 准备条件 在mysql中创建数据库echartsdb&#xff0c;数据库中创建表t_comment表&#xff0c;表中设置两个字段word与count&#xff0c;添加表中的数据。如&#xff1a;附件中的 echartsdb.sql 3. SpringBoot…

将excel数据拆分成多个excel文件

一、背景&#xff1a; 平时在日常工作中&#xff0c;经常需要将excel的文件数据进行拆分&#xff0c;拆分成多个excel文件&#xff0c;然而用人工来处理这个既耗时&#xff0c;又费精力&#xff0c;眼睛会疲劳&#xff0c;时间长了操作上会出现失误&#xff0c;导致数据拆分错…

BetterZip2024Mac上一款功能强大的Mac平台解压压缩软件

一、软件概述 BetterZip是一款Mac平台上的压缩解压缩工具&#xff0c;它为用户提供了一个方便的方式来处理各种压缩文件&#xff0c;包括但不限于ZIP、TAR、GZIP等格式。除了基本的压缩解压缩功能外&#xff0c;BetterZip还具备文件预览、文件加密、分卷压缩等高级功能&#x…

JUC:double-checked locking(DCL) 懒汉单例模式

文章目录 double-checked locking(DCL) 问题解决方法 volatile作用 double-checked locking(DCL) 问题 第一个if用于后续进入的线程&#xff0c;不用再获取锁来判断是否已经创建了对象。第二个if&#xff0c;为的是第一个进入的线程创建对象&#xff0c;以及防止卡在第一个if之…

nodeJs 实现视频的转换(超详细教程)

前段时间拿到一个视频是4k的&#xff0c;没法播放&#xff0c;于是通过 node.js 和 ffmpeg 实现了视频的转换。在win10 系统下实现。 所需工具 node 16.19 直接安装 ffmpeg-5.1.1-essentials_build 解压后重名 ffmpeg 放到C盘 然后配置下环境变量 Git-2.42.0.2-64-bit 直接…

【HTML】注册页面制作 案例二

&#xff08;大家好&#xff0c;今天我们将通过案例实战对之前学习过的HTML标签知识进行复习巩固&#xff0c;大家和我一起来吧&#xff0c;加油&#xff01;&#x1f495;&#xff09; 案例复习 通过综合案例&#xff0c;主要复习&#xff1a; 表格标签&#xff0c;可以让内容…

linux通过进程pid查询容器docker

我遇到的问题是在docker中启动了进行&#xff0c;占用显卡&#xff0c;如下nvidis-smi查看&#xff1a; 现在要查询pid16325属于哪个容器ID&#xff0c;指令&#xff1a; ps -e -o pid,cmd,comm,cgroup | grep 16325查到如下结果&#xff0c;其中12:cpuset:/docker/ 后面的 8…

算法打卡day32|贪心算法篇06|Leetcode 738.单调递增的数字、968.监控二叉树

算法题 Leetcode 738.单调递增的数字 题目链接:738.单调递增的数字 大佬视频讲解&#xff1a;单调递增的数字视频讲解 个人思路 这个题目就是从例子中找规律&#xff0c;例如 332&#xff0c;从后往前遍历&#xff0c;32不是单调递增将2变为9,3减1&#xff0c;变成了329&…

浏览器工作原理与实践--WebAPI:XMLHttpRequest是怎么实现的

在上一篇文章中我们介绍了setTimeout是如何结合渲染进程的循环系统工作的&#xff0c;那本篇文章我们就继续介绍另外一种类型的WebAPI——XMLHttpRequest。 自从网页中引入了JavaScript&#xff0c;我们就可以操作DOM树中任意一个节点&#xff0c;例如隐藏/显示节点、改变颜色、…

HarmonyOS 应用开发之通过数据管理服务实现数据共享静默访问

场景介绍 典型跨应用访问数据的用户场景下&#xff0c;数据提供方会存在多次被拉起的情况。 为了降低数据提供方拉起次数&#xff0c;提高访问速度&#xff0c;OpenHarmony提供了一种不拉起数据提供方直接访问数据库的方式&#xff0c;即静默数据访问。 静默数据访问通过数据…

社交媒体市场:揭示Facebook的商业模式

在数字化时代&#xff0c;社交媒体已经成为人们生活中不可或缺的一部分。Facebook作为全球最大的社交媒体平台之一&#xff0c;其商业模式的运作方式对于了解社交媒体市场的发展趋势和影响力至关重要。本文将深入探讨Facebook的商业模式&#xff0c;剖析其运作机制&#xff0c;…

用户体验:探讨Facebook如何优化用户体验

在数字化时代&#xff0c;用户体验是社交媒体平台成功与否的关键因素之一。作为全球最大的社交媒体平台之一&#xff0c;Facebook一直在努力优化用户体验&#xff0c;从功能设计到内容呈现再到隐私保护&#xff0c;不断提升用户满意度。本文将深入探讨Facebook如何优化用户体验…

Codeforces Round 928 (Div. 4)F. Vlad and Avoiding X 二维转一维成为线性,然后dfs就可以线性暴力

当所有的都是Black时&#xff0c;只需要8个点就可以不出现“X”型。 ——题解 Problem - F - Codeforces 思路&#xff1a; 如标题。此题还是值得思考练习下暴力写法的。 **为什么上图有的被粉色标记了呢&#xff0c;因为白色和粉色之间互不干扰。** 所以题解把两种…

【测试篇】接口测试

接口测试&#xff0c;可以用可视化工具 postman。 如何做接口测试&#xff1f;&#xff1f; 我们可以先在浏览器中随机进入一个网页&#xff0c;打开开发者工具&#xff08;F12&#xff09;。 随便找一个接口Copy–>Copy as cURL(bash) 打开postman 复制地址 进行发送。 …

django-haystack,具有全文搜索功能的 Python 库!

目录 前言 安装与配置 全文搜索基础 搜索引擎配置 索引配置 搜索视图与模板 过滤器与排序 自定义搜索逻辑 应用场景 1. 电子商务网站的商品搜索 2. 新闻网站的文章搜索 3. 社交网站的用户搜索 4.企业内部系统的文档搜索 总结 前言 大家好&#xff0c;今天为大家分享…

2012年认证杯SPSSPRO杯数学建模A题(第一阶段)蜘蛛网全过程文档及程序

2012年认证杯SPSSPRO杯数学建模 A题 蜘蛛网 原题再现&#xff1a; 第一阶段问题   世界上生存着许多种类的蜘蛛&#xff0c;而其中的大部分种类都会通过结网来进行捕食。请你建立合理的数学模型&#xff0c;说明蜘蛛网织成怎样的结构才是最合适的。 整体求解过程概述(摘要…

ubuntu-server部署hive-part2-安装hadoop

参照 https://blog.csdn.net/qq_41946216/article/details/134345137 操作系统版本&#xff1a;ubuntu-server-22.04.3 虚拟机&#xff1a;virtualbox7.0 安装hadoop ​​​​​​下载上传 下载地址 https://archive.apache.org/dist/hadoop/common/hadoop-3.3.4/ 以root用…

Ps:HDR 色调

HDR 技术旨在通过合并不同曝光度的图像来扩展照片的光照细节范围&#xff0c;使得最终图像能够同时展示最亮和最暗区域的细节。 HDR 色调 HDR Toning命令能够在单张图像上重现类似的效果&#xff0c;无需多张不同曝光的照片。 Ps菜单&#xff1a;图像/调整/HDR 色调 Adjustment…

【EasyExcel】—— 实现excel动态表头设置、多个sheet

引入jar <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.0</version></dependency>代码 public static void main(String[] args) {//选择存储地址String fileName "/User…