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

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);//设置排序sqlvoid setOrderSql(const QString &orderSql);//设置条件sqlvoid 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.rhkb.cn/news/295263.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

debian的使用笔记

1. XP风格任务栏 安装 debian-live-12.5.0-amd64-xfce.iso 后&#xff0c;把下面的任务栏删除&#xff0c;把上面的任务栏移到下面&#xff0c;然后设置如下选项 2. 命令自动补全 sudo apt install bash-completion 3. 找不到命令 sudo apt install command-not-found sudo…

RISC-V GNU Toolchain 工具链安装问题解决(含 stdio.h 问题解决)

我的安装过程主要参照 riscv-collab/riscv-gnu-toolchain 的官方 Readme 和这位佬的博客&#xff1a;RSIC-V工具链介绍及其安装教程 - 风正豪 &#xff08;大佬的博客写的非常详细&#xff0c;唯一不足就是 sudo make linux -jxx 是全部小写。&#xff09; 工具链前前后后我装了…

论文阅读RangeDet: In Defense of Range View for LiDAR-based 3D Object Detection

文章目录 RangeDet: In Defense of Range View for LiDAR-based 3D Object Detection问题笛卡尔坐标结构图Meta-Kernel Convolution RangeDet: In Defense of Range View for LiDAR-based 3D Object Detection 论文&#xff1a;https://arxiv.org/pdf/2103.10039.pdf 代码&…

栈溢出攻击的软硬件缓解技术

为了防范栈溢出攻击&#xff0c;现代处理器架构&#xff08;如Arm架构&#xff09;具有执行权限。在Armv8-A中&#xff0c;主要的控制是在MMU地址转换表&#xff08;translation tables&#xff09;中的执行权限位。 UXN User (EL0) Execute-never …

SpringBoot+thymeleaf完成视频记忆播放功能

一、背景 1)客户要做一个视频播放功能,要求是系统能够记录观看人员在看视频时能够记录看到了哪个位置,在下次观看视频的时候能够从该位置进行播放。 2)同时,也要能够记录是谁看了视频,看了百分之多少。 说明:由于时间关系和篇幅原因,我们这里只先讨论第一个要求,第…

基于WEB的花卉养殖知识平台的设计与实现|SSM+ Mysql+Java(可运行源码+数据库+LW)植物绿植种植,留言管理,知识科普,新闻数据

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读300套最新项目持续更新中..... 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含ja…

Android Studio学习5——布局layout与视图view

wrap_content&#xff0c;内容有多大&#xff0c;就有多宽&#xff08;包裹&#xff09; 布局 padding 边框与它自身的内容 margin 控件与控件之间

docker容器环境安装记录(MAC M1)(完善中)

0、背景 在MAC M1中搭建商城项目环境时&#xff0c;采用docker统一管理开发工具&#xff0c;期间碰到了许多环境安装问题&#xff0c;做个总结。 1、安装redis 在宿主机新建redis.conf文件运行创建容器命令&#xff0c;进行容器创建、端口映射、文件挂载、以指定配置文件启动…

【Python面试题收录】Python的深浅拷贝

一、Python的深浅拷贝的区别 在Python中&#xff0c;深拷贝和浅拷贝是两种不同的对象复制机制&#xff0c;它们的主要区别在于如何处理对象内部所包含的可变或不可变类型的子对象。 浅拷贝 是指创建一个新的对象&#xff0c;但它只复制了原对象的第一层内容&#xff0c;也就是说…

Linux|centos7|postgresql数据库主从复制之异步还是同步的问题

前言&#xff1a; postgresql数据库是一个比较先进的中型关系型数据库&#xff0c;原本以为repmgr和基于repmgr的主从复制是挺简单的一个事情&#xff0c;但现实很快就给我教育了&#xff0c;原来postgresql和MySQL一样的&#xff0c;也是有异步或者同步的复制区别的 Postgre…

运放知识点总结

目录 一、运放基础知识 (operational amplifier) 1.由来 2.用途 3.符号 4.内部结构​编辑 5.虚短虚断 二、同相放大电路 &#xff08;Non-inverting Amplifier&#xff09; 三、反相放大电路 (Inverting Amplifier) 四、差分放大电路 (Difference Amplifier) 五、加法…

redis 数据库的安装及使用方法

目录 一 关系数据库与非关系型数据库 &#xff08;一&#xff09;关系型数据库 1&#xff0c;关系型数据库是什么 2&#xff0c;主流的关系型数据库有哪些 3&#xff0c;关系型数据库注意事项 &#xff08;二&#xff09;非关系型数据库 1&#xff0c;非关系型数据库是…

如果在 Ubuntu 系统中两个设备出现两个相同的端口号解决方案

问题描述&#xff1a; 自己的移动机器人在为激光雷达和IMU配置动态指定的端口时&#xff0c;发现激光雷达和深度相机配置的 idVendor 和 idProduct 相同&#xff0c;但是两个设备都具有不同的ttyUSB号&#xff0c;如下图所示 idVendor&#xff1a;代表着设备的生产商ID,由USB设…

EFK(elasticsearch+filebeat+kibana)日志分析平台搭建

本文是记录一下EFK日志平台的搭建过程 项目背景&#xff1a; 此次搭建的日志分析平台主要是采集服务器上的java服务的log日志(输出的日志已经是json格式)&#xff0c;这些日志都已经按照不同环境输出到/home/dev /home/test1 /home/test2 目录下了&#xff0c;按照不同的应…

Mybatis——一对一映射

一对一映射 预置条件 在某网络购物系统中&#xff0c;一个用户只能拥有一个购物车&#xff0c;用户与购物车的关系可以设计为一对一关系 数据库表结构&#xff08;唯一外键关联&#xff09; 创建两个实体类和映射接口 package org.example.demo;import lombok.Data;import …

在flutter中添加video_player【视频播放插件】

添加插件依赖 dependencies:video_player: ^2.8.3插件的用途 在Flutter框架中&#xff0c;video_player 插件是一个专门用于播放视频的插件。它允许开发者在Flutter应用中嵌入视频播放器&#xff0c;并提供了一系列功能来控制和定制视频播放体验。这个插件对于需要在应用中展…

舞蹈网站制作分享,舞蹈培训商城网站设计案例分享,wordpress主题分享

嘿&#xff0c;朋友们&#xff01;今天我要跟你们唠一唠一个超级酷炫的舞蹈培训商城网站设计案例。 咱先说说这个网站的目标哈&#xff0c;那就是得让喜欢舞蹈的小伙伴们能够轻轻松松找到自己心水的课程和商品。 那制作过程都有啥呢&#xff1f;别急&#xff0c;听我慢慢道来。…

论文笔记 - :DIGGING INTO OUTPUT REPRESENTATION FOR MONOCULAR 3D OBJECT DETECTION

Title: 深入研究单目 3D 物体检测的输出表示 Abstract 单目 3D 对象检测旨在从单个图像中识别和定位 3D 空间中的对象。最近的研究取得了显着的进展&#xff0c;而所有这些研究都遵循基于 LiDAR 的 3D 检测中的典型输出表示。 然而&#xff0c;在本文中&#xff0c;我们认为…

超舒适SUV豪华再进化:比亚迪全新腾势N7发布

钟爱SUV的小伙伴们&#xff0c;想必对比亚迪旗下的腾势N7都不会感到陌生。近日&#xff0c;比亚迪正式发布了全新腾势N7&#xff0c;新车型不但继承了腾势品牌一贯的豪华品质&#xff0c;而且还在智能、舒适、便利等方面实现了全面升级&#xff0c;成为百万级超舒适SUV市场的佼…

VMware-16.0配置虚拟机网络模式

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、为什么要配置网络&#xff1f;二、配置步骤1.检查VMware服务2.进入配置页面3.添加网络模式1.Bridge2.NAT3.Host-only 4.DHCP租约5.静态IP 三、使用总结 前言…