最近看到關於qt 中mysql 瀏覽資料分頁,有人用到了qtablewidget 翻頁時手動添加
就在想,既然qt中提供了view和model,為什麼放著不用哪?
簡單實現了一把,記錄一下
首先重新繼承一下QSqlTableModel,翻頁時修改記錄數
userSqlTableModel.h
#ifndef USERSQLTABLEMODEL_H#define USERSQLTABLEMODEL_H#include <QSqlTableModel>class UserSqlTableModel : public QSqlTableModel{ Q_OBJECTpublic: explicit UserSqlTableModel(QObject *parent = 0,QSqlDatabase db = QSqlDatabase() ); void setStart(int start){this->m_nStart = start;} int getStart(){return this->m_nStart;}public: QVariant headerData(int section, Qt::Orientation orientation, int role) const;private: int m_nStart; //記錄資料起始id};#endif // USERSQLTABLEMODEL_H
userSqlTableModel.cpp
#include "usersqltablemodel.h"UserSqlTableModel::UserSqlTableModel(QObject *parent,QSqlDatabase db) : QSqlTableModel(parent,db){ m_nStart = 0;}QVariant UserSqlTableModel::headerData(int section, Qt::Orientation orient, int role) const{ if (orient == Qt::Vertical && role == Qt::DisplayRole) return section + m_nStart; return QSqlTableModel::headerData(section,orient,role);}
在對話方塊類中聲明幾個變數:
private: UserSqlTableModel *userModel; int m_nTotal; //總記錄數 int m_nPageSize; //每頁顯示條數 int m_nCurPageSize; //當前頁資料條數 int m_nStart; //起始記錄數
初始設定變數:
this->m_nStart = -1; this->m_nPageSize = 6; this->m_nCurPageSize = 0; this->m_nTotal = 0; userModel = new UserSqlTableModel(this); userModel->setTable("user"); userModel->setSort(User_Name, Qt::AscendingOrder); userModel->setHeaderData(User_Name, Qt::Horizontal,tr("賬 號")); userModel->setHeaderData(User_GroupChName, Qt::Horizontal,tr("所屬組")); userModel->setHeaderData(User_Description,Qt::Horizontal, tr("備忘")); userView->setModel(userModel); userView->setSelectionMode(QAbstractItemView::SingleSelection); userView->setSelectionBehavior(QAbstractItemView::SelectRows); userView->setColumnHidden(User_Id, true); userView->setColumnHidden(User_Pwd, true); userView->setColumnHidden(User_Group, true); userView->resizeColumnsToContents(); userView->horizontalHeader()->setStretchLastSection(true); this->m_nTotal = this->getTotal(); on_pushButton_first_clicked();
翻頁槽:
void UserDialog::on_pushButton_first_clicked() //首頁{ if(this->m_nStart == 0 && this->m_nCurPageSize == this->m_nPageSize) return; this->m_nStart = 0; this->m_nCurPageSize = this->m_nTotal > this->m_nPageSize ? this->m_nPageSize : this->m_nTotal; updateInfo();}void UserDialog::on_pushButton_previous_clicked() //上一頁{ if(this->m_nStart == 0 || this->m_nTotal <= 0) return; this->m_nStart -= this->m_nPageSize; this->m_nCurPageSize = this->m_nPageSize; updateInfo();}void UserDialog::on_pushButton_next_clicked() //下一頁{ if(this->m_nCurPageSize < this->m_nPageSize || this->m_nTotal <= 0) return; this->m_nStart += this->m_nPageSize; this->m_nCurPageSize = this->m_nTotal - this->m_nStart > this->m_nPageSize ? this->m_nPageSize : this->m_nTotal - this->m_nStart; updateInfo();}void UserDialog::on_pushButton_last_clicked() //尾頁{ if(this->m_nCurPageSize < this->m_nPageSize || this->m_nTotal <= 0) return; this->m_nCurPageSize = this->m_nTotal % this->m_nPageSize; this->m_nStart = this->m_nTotal - this->m_nCurPageSize; updateInfo();}
void UserDialog::updateInfo(){ QString strFilter = QString(" 1=1 limit %1,%2").arg(this->m_nStart).arg(this->m_nCurPageSize); userModel->setStart(this->m_nStart + 1); userModel->setFilter(strFilter); userModel->select();}
總結來關鍵的就有兩點:
1、重載QSqlTableModel,在翻頁時重設記錄條數
2、設定model的過濾條件
當時直接 setFilter("limit 0,1;")始終不行 ,但是直接執行帶limit 的 sql 語句就沒有問題。
最終在手冊中看到這樣一句話
The filter is a SQL WHERE clause without the keyword WHERE (for example, name='Josephine').
就是說過濾條件即為省略where的條件陳述式
select * from table where limit 0,6; 肯定是不行的
加一個永真條件就哦了
同時注意一下最後的‘;’若沒有用qt 2.3.0會報執行時錯誤:
D:\qt\1010\tengxun\fontsampler-build-desktop\debug\fontsampler.exe 啟動中...
ASSERT: "idx >= 0 && idx < s" in file
..\..\include/QtCore/../../../../../../ndk_buildrepos/qt-desktop/src/corelib/tools/qvarlengtharray.h, line 107