当前位置:Gxlcms > 数据库问题 > Qt开源作品19-通用数据库翻页查询

Qt开源作品19-通用数据库翻页查询

时间:2021-07-01 10:21:17 帮助过:15人阅读

一、前言

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

主要功能:

  1. 自动按照设定的每页多少行数据分页
  2. 只需要传入表名/字段集合/每页行数/翻页指示按钮/文字指示标签
  3. 提供公共静态方法绑定字段数据到下拉框
  4. 建议条件字段用数字类型的主键,速度极快
  5. 增加线程查询符合条件的记录总数,数据量巨大时候不会卡主界面
  6. 提供查询结果返回信号,包括当前页/总页数/总记录数/查询用时
  7. 可设置所有列或者某一列对齐样式例如居中或者右对齐
  8. 可设置增加一列,列的位置,标题,宽度
  9. 可设置要查询的字段集合

二、代码思路

  1. <code class="language-c++">void DbPage::bindData(const QString &sql)
  2. {
  3. queryModel->setQuery(sql, QSqlDatabase::database(connName));
  4. tableView->setModel(queryModel);
  5. //依次设置列标题列宽
  6. int columnCount = tableView->model()->columnCount();
  7. int nameCount = columnNames.count();
  8. columnCount = columnCount > nameCount ? nameCount : columnCount;
  9. QList<QString> columnNames = this->columnNames;
  10. QList<int> columnWidths = this->columnWidths;
  11. //根据设置添加新列,将对应新列的标题名称和宽度按照索引位置插
  12. if (insertColumnIndex >= 0) {
  13. columnCount++;
  14. columnNames.insert(insertColumnIndex, insertColumnName);
  15. columnWidths.insert(insertColumnIndex, insertColumnWidth);
  16. queryModel->insertColumn(insertColumnIndex);
  17. }
  18. //设置列标题和列宽度
  19. for (int i = 0; i < columnCount; i++) {
  20. queryModel->setHeaderData(i, Qt::Horizontal, columnNames.at(i));
  21. tableView->setColumnWidth(i, columnWidths.at(i));
  22. }
  23. if (labPageCurrent != 0) {
  24. labPageCurrent->setText(QString("第 %1 页").arg(pageCurrent));
  25. }
  26. if (labPageCount != 0) {
  27. labPageCount->setText(QString("共 %1 页").arg(pageCount));
  28. }
  29. if (labResultCount != 0) {
  30. labResultCount->setText(QString("共 %1 条").arg(resultCount));
  31. }
  32. if (labResultCurrent != 0) {
  33. labResultCurrent->setText(QString("每页 %1 条").arg(resultCurrent));
  34. }
  35. if (labInfo != 0) {
  36. labInfo->setText(QString("共 %1 条 每页 %2 条 共 %3 页 第 %4 页").arg(resultCount).arg(resultCurrent).arg(pageCount).arg(pageCurrent));
  37. }
  38. //发送结果信号
  39. emit receivePage(pageCurrent, pageCount, resultCount, resultCurrent);
  40. }
  41. void DbPage::slot_receiveCount(quint32 count, double msec)
  42. {
  43. if (labResult != 0) {
  44. labResult->setText(QString("查询用时 %1 秒").arg(QString::number(msec / 1000, ‘f‘, 3)));
  45. }
  46. resultCount = count;
  47. int yushu = resultCount % resultCurrent;
  48. //不存在余数,说明是整行,例如300%5==0
  49. if (yushu == 0) {
  50. if (resultCount > 0 && resultCount < resultCurrent) {
  51. pageCount = 1;
  52. } else {
  53. pageCount = resultCount / resultCurrent;
  54. }
  55. } else {
  56. pageCount = (resultCount / resultCurrent) + 1;
  57. }
  58. //2014-10-9增加翻页按钮可用不可用处理,如果只有一页数据,则翻页按钮不可用
  59. if (pageCount <= 1) {
  60. btnFirst->setEnabled(false);
  61. btnLast->setEnabled(false);
  62. btnNext->setEnabled(false);
  63. btnPre->setEnabled(false);
  64. } else {
  65. btnFirst->setEnabled(true);
  66. btnLast->setEnabled(true);
  67. btnNext->setEnabled(true);
  68. btnPre->setEnabled(true);
  69. }
  70. tempSql = QString("select %1 from %2 %3 order by %4").arg(selectColumn).arg(tableName).arg(whereSql).arg(orderSql);
  71. sql = QString("%1 limit %2,%3;").arg(tempSql).arg(startIndex).arg(resultCurrent); //组织分页SQL语句
  72. bindData(sql);
  73. }
  74. void DbPage::first()
  75. {
  76. if (pageCount > 1) {
  77. startIndex = 0;
  78. pageCurrent = 1;
  79. sql = QString("%1 limit %2,%3;").arg(tempSql).arg(startIndex).arg(resultCurrent);
  80. bindData(sql);
  81. btnLast->setEnabled(true);
  82. btnNext->setEnabled(true);
  83. }
  84. btnFirst->setEnabled(false);
  85. btnPre->setEnabled(false);
  86. }
  87. void DbPage::previous()
  88. {
  89. if (pageCurrent > 1) {
  90. pageCurrent--;
  91. startIndex -= resultCurrent;
  92. sql = QString("%1 limit %2,%3;").arg(tempSql).arg(startIndex).arg(resultCurrent);
  93. bindData(sql);
  94. btnLast->setEnabled(true);
  95. btnNext->setEnabled(true);
  96. }
  97. if (pageCurrent == 1) {
  98. btnFirst->setEnabled(false);
  99. btnPre->setEnabled(false);
  100. }
  101. }
  102. void DbPage::next()
  103. {
  104. if (pageCurrent < pageCount) {
  105. pageCurrent++;
  106. startIndex += resultCurrent;
  107. sql = QString("%1 limit %2,%3;").arg(tempSql).arg(startIndex).arg(resultCurrent);
  108. bindData(sql);
  109. btnFirst->setEnabled(true);
  110. btnPre->setEnabled(true);
  111. }
  112. if (pageCurrent == pageCount) {
  113. btnLast->setEnabled(false);
  114. btnNext->setEnabled(false);
  115. }
  116. }
  117. void DbPage::last()
  118. {
  119. if (pageCount > 0) {
  120. startIndex = (pageCount - 1) * resultCurrent;
  121. pageCurrent = pageCount;
  122. sql = QString("%1 limit %2,%3;").arg(tempSql).arg(startIndex).arg(resultCurrent);
  123. bindData(sql);
  124. btnFirst->setEnabled(true);
  125. btnPre->setEnabled(true);
  126. }
  127. btnLast->setEnabled(false);
  128. btnNext->setEnabled(false);
  129. }
  130. </code>

三、效果图

技术图片

四、开源主页

以上作品完整源码下载都在开源主页,会持续不断更新作品数量和质量,欢迎各位关注。

  1. 国内站点:https://gitee.com/feiyangqingyun/QWidgetDemo
  2. 国际站点:https://github.com/feiyangqingyun/QWidgetDemo
  3. 个人主页:https://blog.csdn.net/feiyangqingyun
  4. 知乎主页:https://www.zhihu.com/people/feiyangqingyun/

Qt开源作品19-通用数据库翻页查询

标签:问题   主页   国内   代码   tee   page   数据分页   主键   条件   

人气教程排行