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