qt使用qsqltablemodel和tableview控件对数据库进行操作和显示,但是qsqltablemodel本身并不支持翻页操作。
但是qsqltablemodel的select函数会调用selectStatement函数返回的语句,进行数据库的查询操作,也就是说可以通过继承qsqltablemodel类,覆写其中的selectStatement函数来实现显示特定页数的数据
自定义类mySqlTableModel 继承qsqltablemodel

class mySqlTableModel : public QSqlTableModel
{
public:
    mySqlTableModel();
    QString selectStatement() const;
    void totalRowCount();
    void setSelectAllData(bool choose);
private:
    int totalRows;
    int currentPage;
    bool selectAllData;
};

覆写selectStatement函数

QString mySqlTableModel::selectStatement()const{
    QString strRet;
    if(selectAllData){
        return this->QSqlTableModel::selectStatement();
    }else{
        strRet+="select * from table_1 limit 5 offset "+QString::number((currentPage-1)*5);
    }
    return strRet;
}

为什么加一个selectAllData变量,因为QSqlTableModel的filter函数会同样使用selectStatement函数,为了查询数据的完整性,在使用filter函数时将selectAllData赋值真,使用原生的selectStatement函数
对总行数的统计

void mySqlTableModel::totalRowCount(){
    QSqlQuery query;
    query.exec("select * from table_1");
    QSqlQueryModel *querymodel=new QSqlQueryModel();
    querymodel->setQuery(query);
    totalRows=querymodel->rowCount();
}

mySqlTableModel上翻页下翻页函数

//下翻页
bool mySqlTableModel::pageDown(){
    if(totalRows>currentPage*5){
        currentPage++;
        return true;
    }
    return false;
}
//上翻页
bool mySqlTableModel::pageUp(){
    if(currentPage>1){
        currentPage--;
        return true;
    }
    return false;
}

主程序中使用mySqlTableModel实现翻页(model为mySqlTableModel的实例)

//下翻页
void MainWindow::on_pushButton_3_clicked()
{
    model->pageDown();
    model->setSelectAllData(false);
    model->select();

}
//上翻页
void MainWindow::on_pushButton_2_clicked()
{
    model->pageUp();
    model->setSelectAllData(false);
    model->select();
}
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐