千家信息网

Qt通用数据库翻页查询如何实现

发表于:2024-11-11 作者:千家信息网编辑
千家信息网最后更新 2024年11月11日,本篇内容介绍了"Qt通用数据库翻页查询如何实现"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、前言
千家信息网最后更新 2024年11月11日Qt通用数据库翻页查询如何实现

本篇内容介绍了"Qt通用数据库翻页查询如何实现"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

一、前言

在Qt与数据库结合编程的过程中,记录一多,基本上都需要用到翻页查看记录,翻页有个好处就是可以减轻显示数据的表格的压力,不需要一次性将数据库表的记录全部显示,也基本上没有谁在一页上需要一次性显示所有记录,搜索引擎搜索出来的结果也基本上都是翻页显示的,那么问题来了,有没有一种通用的办法可以只需要传入表名和查询条件自动翻页呢,答案是肯定的,Qt对数据库操作的封装也是相当完美的,显示也是如此,为此特意封装成了一个类,直接用就行。

主要功能:

  1. 自动按照设定的每页多少行数据分页

  2. 只需要传入表名/字段集合/每页行数/翻页指示按钮/文字指示标签

  3. 提供公共静态方法绑定字段数据到下拉框

  4. 建议条件字段用数字类型的主键,速度极快

  5. 增加线程查询符合条件的记录总数,数据量巨大时候不会卡主界面

  6. 提供查询结果返回信号,包括当前页/总页数/总记录数/查询用时

  7. 可设置所有列或者某一列对齐样式例如居中或者右对齐

  8. 可设置增加一列,列的位置,标题,宽度

  9. 可设置要查询的字段集合

二、代码思路

void DbPage::bindData(const QString &sql){    queryModel->setQuery(sql, QSqlDatabase::database(connName));    tableView->setModel(queryModel);    //依次设置列标题列宽    int columnCount = tableView->model()->columnCount();    int nameCount = columnNames.count();    columnCount = columnCount > nameCount ? nameCount : columnCount;    QList columnNames = this->columnNames;    QList columnWidths = this->columnWidths;    //根据设置添加新列,将对应新列的标题名称和宽度按照索引位置插    if (insertColumnIndex >= 0) {        columnCount++;        columnNames.insert(insertColumnIndex, insertColumnName);        columnWidths.insert(insertColumnIndex, insertColumnWidth);        queryModel->insertColumn(insertColumnIndex);    }    //设置列标题和列宽度    for (int i = 0; i < columnCount; i++) {        queryModel->setHeaderData(i, Qt::Horizontal, columnNames.at(i));        tableView->setColumnWidth(i, columnWidths.at(i));    }    if (labPageCurrent != 0) {        labPageCurrent->setText(QString("第 %1 页").arg(pageCurrent));    }    if (labPageCount != 0) {        labPageCount->setText(QString("共 %1 页").arg(pageCount));    }    if (labResultCount != 0) {        labResultCount->setText(QString("共 %1 条").arg(resultCount));    }    if (labResultCurrent != 0) {        labResultCurrent->setText(QString("每页 %1 条").arg(resultCurrent));    }    if (labInfo != 0) {        labInfo->setText(QString("共 %1 条  每页 %2 条  共 %3 页  第 %4 页").arg(resultCount).arg(resultCurrent).arg(pageCount).arg(pageCurrent));    }    //发送结果信号    emit receivePage(pageCurrent, pageCount, resultCount, resultCurrent);}void DbPage::slot_receiveCount(quint32 count, double msec){    if (labResult != 0) {        labResult->setText(QString("查询用时 %1 秒").arg(QString::number(msec / 1000, 'f', 3)));    }    resultCount = count;    int yushu = resultCount % resultCurrent;    //不存在余数,说明是整行,例如300%5==0    if (yushu == 0) {        if (resultCount > 0 && resultCount < resultCurrent) {            pageCount = 1;        } else {            pageCount = resultCount / resultCurrent;        }    } else {        pageCount = (resultCount / resultCurrent) + 1;    }    //2014-10-9增加翻页按钮可用不可用处理,如果只有一页数据,则翻页按钮不可用    if (pageCount <= 1) {        btnFirst->setEnabled(false);        btnLast->setEnabled(false);        btnNext->setEnabled(false);        btnPre->setEnabled(false);    } else {        btnFirst->setEnabled(true);        btnLast->setEnabled(true);        btnNext->setEnabled(true);        btnPre->setEnabled(true);    }    tempSql = QString("select %1 from %2 %3 order by %4").arg(selectColumn).arg(tableName).arg(whereSql).arg(orderSql);    sql = QString("%1 limit %2,%3;").arg(tempSql).arg(startIndex).arg(resultCurrent); //组织分页SQL语句    bindData(sql);}void DbPage::first(){    if (pageCount > 1) {        startIndex = 0;        pageCurrent = 1;        sql = QString("%1 limit %2,%3;").arg(tempSql).arg(startIndex).arg(resultCurrent);        bindData(sql);        btnLast->setEnabled(true);        btnNext->setEnabled(true);    }    btnFirst->setEnabled(false);    btnPre->setEnabled(false);}void DbPage::previous(){    if (pageCurrent > 1) {        pageCurrent--;        startIndex -= resultCurrent;        sql = QString("%1 limit %2,%3;").arg(tempSql).arg(startIndex).arg(resultCurrent);        bindData(sql);        btnLast->setEnabled(true);        btnNext->setEnabled(true);    }    if (pageCurrent == 1) {        btnFirst->setEnabled(false);        btnPre->setEnabled(false);    }}void DbPage::next(){    if (pageCurrent < pageCount) {        pageCurrent++;        startIndex += resultCurrent;        sql = QString("%1 limit %2,%3;").arg(tempSql).arg(startIndex).arg(resultCurrent);        bindData(sql);        btnFirst->setEnabled(true);        btnPre->setEnabled(true);    }    if (pageCurrent == pageCount) {        btnLast->setEnabled(false);        btnNext->setEnabled(false);    }}void DbPage::last(){    if (pageCount > 0) {        startIndex = (pageCount - 1) * resultCurrent;        pageCurrent = pageCount;        sql = QString("%1 limit %2,%3;").arg(tempSql).arg(startIndex).arg(resultCurrent);        bindData(sql);        btnFirst->setEnabled(true);        btnPre->setEnabled(true);    }    btnLast->setEnabled(false);    btnNext->setEnabled(false);}

三、效果图

"Qt通用数据库翻页查询如何实现"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

0