qt mysql 分页_Qt:利用QSqlQueryModel进行分页(上)

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

QSqlQueryModel类为SQL结果集提供了一个只读数据模型

先说一下分页思路吧:QSqlQueryModel 是通过 setQuery 函数进行查询的,setQuery 函数支持sql语句查询,那sql语句中有有一个 LIMIT ,就是使用LIMIT进行分页。

LIMI:Limit接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目

LIMI介绍:https://www.cnblogs.com/acm-bingzi/p/msqlLimit.html

这篇文章就是使用sql语句的LIMIT进行分页,sql语句拼接是重点。注意:拼接sql一定要注意空格、空间、空格

第一步:重写 QSqlQueryModel

#include

#include

classcustomQSqlQueryModel : public QSqlQueryModel

{

Q_OBJECT

public:

explicit customQSqlQueryModel(QObject*parent = nullptr);

//设置sql语句 到 from tableName 结束

void setSql(QString sql);

//设置过滤条件

void setFilter(QString filter);

//设置sql查询条数

void setLimitCount(int count);

//设置排序

int setOrderBy(QString field);

//添加数据到 m_orderByFields

void appOrderByList(QString field,boolisDESC = false);

//设置left join 的表

void setJoin(QString tabelName,QStringoldFieldName,QString newFieldName);

//设置除了主表其他表进行相连

void setOtherJoin(QStringtableNameLeft,QString tableNameRight,QString joinFieldName,QStringshowFieldName,int colIndex);

//是否已连接

bool isJoin(QString tableName,QString sql);

//拼接sql语句

void jointSql();

//执行查询语句

void mySqlSelect();

//执行查询语句--是否重新拼接sql语句

void mySqlSelect(bool queryAgain);

//拼接sql私有方法

private:

//拼接left join

void jointLeftJoin(QString &tmp);

//拼接ohterLeftJOin

void jointOtherLeftJoin(QString &tmp);

//拼接where

void jointWhere(QString &tmp);

//拼接OrderBy

void jointOrderBy(QString &tmp);

//拼接LIMIT

void jointLimit(QString &tmp);

//分页的方法---------------

public:

//计算页数

void calculatePage();

//设置第几页

bool currentPageEdit(int page);

//获取当前页

int getCurrentPage();

//获取总页数

int getTotalNumPage();

private:

QString m_sql; //初始sql

QString m_startTableName; //初始的表名,left join 时 用到

QString m_fullSql; //拼接完成的sql

//Left join 使用到的储存列表

QStringList m_joinTableNames; //连接表

QStringList m_joinOldFieldNames;//旧列

QStringList m_joinNewFieldNames;//新列

//其它join

QStringList m_otherJoinTableLeft; //左,作为连接表

QStringList m_otherJoinTableRight; //右,作为被连接表

QStringList m_joinFieldNames; //连接的键值,双方名字需要相同

QStringList m_showFieldNames; //右,被连接表显示字段

QList m_colIndexs; //显示的列索引

QString m_filter; //过滤条件

QStringList m_orderByFields; //排序字段集合

QList m_isDESCs; //是否倒序

bool m_queryAgain; //查看是否更新了查询条件,true :重新拼接sql语句,false 不重新拼接

//分页的私有成员变量

private:

QPoint m_limit; //查询控制条数 x :从x- 1开始 , y : 查询条数

QString m_NotLimitStr; //不包含limit语句,用于查询数据总条数

int m_thisPage; //当前页

int m_totalPage; //总页数

// QAbstractItemModel interface

public:

//控制数据居中显示

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

第二步:实现重写 QSqlQueryModel的方法---------

#include"customqsqlquerymodel.h"

#include

#include

#include"DB/sqldatabase.h" //数据库database,查询时用到

customQSqlQueryModel::customQSqlQueryModel(QObject*parent)

: QSqlQueryModel(parent)

{

//由于用到了QPoint来存放limit两个常量,在这里初始化一下

m_limit.setX(0);

m_limit.setY(0);

m_queryAgain = true;

}

/**

* @brief customQSqlQueryModel::setSql

* @param sql 初始sql语句

* 功能:设置sql语句,获取表名

*/

voidcustomQSqlQueryModel::setSql(QString sql)

{

m_sql = sql;

//获取查询的表格名

m_startTableName = m_sql.split("",QString::SkipEmptyParts).last();

}

/**

* @brief customQSqlQueryModel::setFilter

* @param filter 条件sql语句,不包含where,请自己注意sql语句的空格

* @param filterValues 条件语句的 值

* 功能:设置条件语句

*/

voidcustomQSqlQueryModel::setFilter(QString filter)

{

m_filter = filter;

}

/**

* @brief customQSqlQueryModel::setLimit

* @param count 读取的总数

* 功能:设置LIMIT 第二个参数,并将当前页初始化为第一页

*/

voidcustomQSqlQueryModel::setLimitCount(int count)

{

m_limit.setY(count);

m_thisPage = 1;

}

/**

* @brief customQSqlQueryModel::setOrderBy

* @param field 列名

* @return 1 : 升序 , 2 :降序 , 0 :不排序

* 功能:通过列名进行排序,排序顺序 升序--》降序--》不排序

*/

intcustomQSqlQueryModel::setOrderBy(QString field)

{

int index = m_orderByFields.indexOf(field);

if(-1 != index)

{

//存在,判断是否降序

if(m_isDESCs[index])

{

//降序,将降序--》不排序:将列名和是否降序从列表中删除

m_orderByFields.removeAt(index);

m_isDESCs.removeAt(index);

return 0;

}

else

{

//升序,将升序--》降序

m_isDESCs[index] = true;

return 2;

}

}

else

{

//不存在,添加

appOrderByList(field);

return 1;

}

}

未完待续。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值