该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
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;
}
}
未完待续。