qt mysql 分頁

來源:互聯網
上載者:User

最近看到關於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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.