一、前言
在Qt與資料庫結合程式設計的過程中,記錄一多,基本上都需要用到翻頁檢視記錄,翻頁有個好處就是可以減輕顯示資料的表格的壓力,不需要一次性将資料庫表的記錄全部顯示,也基本上沒有誰在一頁上需要一次性顯示所有記錄,搜尋引擎搜尋出來的結果也基本上都是翻頁顯示的,那麼問題來了,有沒有一種通用的辦法可以隻需要傳入表名和查詢條件自動翻頁呢,答案是肯定的,Qt對資料庫操作的封裝也是相當完美的,顯示也是如此,為此特意封裝成了一個類,直接用就行。
主要功能:
- 自動按照設定的每頁多少行資料分頁
- 隻需要傳入表名/字段集合/每頁行數/翻頁訓示按鈕/文字訓示标簽
- 提供公共靜态方法綁定字段資料到下拉框
- 建議條件字段用數字類型的主鍵,速度極快
- 增加線程查詢符合條件的記錄總數,資料量巨大時候不會卡主界面
- 提供查詢結果傳回信号,包括目前頁/總頁數/總記錄數/查詢用時
- 可設定所有列或者某一列對齊樣式例如居中或者右對齊
- 可設定增加一列,列的位置,标題,寬度
- 可設定要查詢的字段集合
二、代碼思路
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);
}
三、效果圖

四、開源首頁
以上作品完整源碼下載下傳都在開源首頁,會持續不斷更新作品數量和品質,歡迎各位關注。