时间:2021-07-01 10:21:17 帮助过:15人阅读
在Qt与数据库结合编程的过程中,记录一多,基本上都需要用到翻页查看记录,翻页有个好处就是可以减轻显示数据的表格的压力,不需要一次性将数据库表的记录全部显示,也基本上没有谁在一页上需要一次性显示所有记录,搜索引擎搜索出来的结果也基本上都是翻页显示的,那么问题来了,有没有一种通用的办法可以只需要传入表名和查询条件自动翻页呢,答案是肯定的,Qt对数据库操作的封装也是相当完美的,显示也是如此,为此特意封装成了一个类,直接用就行。
主要功能:
- <code class="language-c++">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<QString> columnNames = this->columnNames;
- QList<int> 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);
- }
- </code>
以上作品完整源码下载都在开源主页,会持续不断更新作品数量和质量,欢迎各位关注。
Qt开源作品19-通用数据库翻页查询
标签:问题 主页 国内 代码 tee page 数据分页 主键 条件