【QT学习】——表格的分页、上下翻页操作(读取数据库后的数据界面显示)

表格读取数据库代码

表格先通过读取数据库,获取到需要读取并显示在界面表格内的数据信息
分页操作的数据库语句:“select * from tb_video limit 3 offset 0”

strcpy(sql,"select * from tb_video limit 3 offset 0");
SignalDB::getInstance()->getTableBySelect(sql,row,col,datares);

SinalDB类里面代码:

#include "signaldb.h"

SignalDB *SignalDB::db=nullptr;
SignalDB::SignalDB()
{
    openDataBase("../data/videoDemo.db");
}

SignalDB::~SignalDB()
{
    closeDataBase();
    delete this->sqldb;
}

SignalDB *SignalDB::getInstance()
{
    //单例设计模式

    if(SignalDB::db==nullptr)
    {
        SignalDB::db=new SignalDB();
    }
    return SignalDB::db;
}

void SignalDB::ReleseInstance()
{

}

int SignalDB::openDataBase(char *path)
{
    int res;
    res=sqlite3_open(path,&this->sqldb);
    if(res==SQLITE_OK)
    {
        qDebug()<<"open sucess";
    }
    else
    {
        qDebug()<<sqlite3_errcode(this->sqldb);
        qDebug()<<sqlite3_errmsg(this->sqldb);
    }
    return res;
}

void SignalDB::closeDataBase()
{
    int res=sqlite3_close(this->sqldb);
    if(res==SQLITE_OK)
    {
        qDebug()<<"open sucess";
    }
    else
    {
        qDebug()<<sqlite3_errcode(this->sqldb);
        qDebug()<<sqlite3_errmsg(this->sqldb);
    }
}

int SignalDB::getTableBySelect(char *sql, int &row, int &col, char **&datares)
{
    int res=sqlite3_get_table(this->sqldb,sql,&datares,&row,&col,&this->errmsg);
    if(res==SQLITE_OK)
    {
        qDebug()<<"open sucess";
    }
    else
    {
        qDebug()<<sqlite3_errcode(this->sqldb);
        qDebug()<<sqlite3_errmsg(this->sqldb);
    }
    return res;
}

表格向上翻页

代码:

void Widget::on_prevBtn_click()
{
    if(this->curPageLab->text().toInt()>1)
    {
        this->model->setRowCount(0);

        int cur=this->curPageLab->text().toInt();
        cur--;
        int index=(cur-1)*3;

        sprintf(sql,"select * from tb_video limit 3 offset %d",index);
        SignalDB::getInstance()->getTableBySelect(sql,row,col,datares);
        for(int i=0;i<row;i++)
        {
            for(int j=0;j<col;j++)
            {
                this->model->setItem(i,j,new QStandardItem(datares[(i+1)*col+j]));
            }
        }
        this->curPageLab->setText(QString::number(cur));
    }
}

表格向下翻页操作代码

代码:

void Widget::on_nextBtn_click()
{
    if(this->curPageLab->text().toInt()<this->countPageLab->text().toInt())
    {
        this->model->setRowCount(0);

        int cur=this->curPageLab->text().toInt();
        cur++;
        int index=(cur-1)*3;

        sprintf(sql,"select * from tb_video limit 3 offset %d",index);
        SignalDB::getInstance()->getTableBySelect(sql,row,col,datares);
        for(int i=0;i<row;i++)
        {
            for(int j=0;j<col;j++)
            {
                this->model->setItem(i,j,new QStandardItem(datares[(i+1)*col+j]));
            }
        }
        this->curPageLab->setText(QString::number(cur));
    }
}

全部代码展示

.h头文件:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QTableView>
#include<QStandardItemModel>
#include<QHeaderView>
#include<QPushButton>
#include<QLabel>
#include<sqlite3.h>
#include<QString>
class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();
    void DataBaseInit();
private:
    QTableView *tv;
    QStandardItemModel *model;
    QPushButton *prevBtn;
    QPushButton *nextBtn;
    QLabel * curPageLab;
    QLabel * segmentLab;
    QLabel * countPageLab;
    sqlite3 * psqlite3;
    char *errmsg;//接受错误信息
    char **datares;//接收结果集
    int row;//接收结果集有多少行
    int col;//接收结果集有多少列
    char sql[100];//sql语句

    int countPage;

 public slots:
    void on_prevBtn_click();
    void on_nextBtn_click();
};

#endif // WIDGET_H

.cpp文件:

#include "widget.h"
#include"tools/signaldb.h"
Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    resize(900,300);
    this->tv=new QTableView(this);
    this->tv->setFixedSize(900,200);

    this->model=new QStandardItemModel(3,7,this);
    this->tv->setModel(this->model);
    //水平和垂直方向自适应窗口大小
    this->tv->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    this->tv->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    //隐藏行号
    this->tv->verticalHeader()->hide();
    //关闭单元格编辑
    this->tv->setEditTriggers(QAbstractItemView::NoEditTriggers);

    //暂时使用绝对布局
    this->tv->setGeometry(0,0,900,200);

    this->prevBtn=new QPushButton("上一页",this);
    this->prevBtn->setGeometry(200,225,100,50);
    this->nextBtn=new QPushButton("下一页",this);
    this->nextBtn->setGeometry(600,225,100,50);
    this->curPageLab=new QLabel("1",this);
    this->curPageLab->setGeometry(400,225,10,50);
    this->segmentLab=new QLabel("/",this);
    this->segmentLab->setGeometry(450,225,100,50);
    this->countPageLab=new QLabel("1",this);
    this->countPageLab->setGeometry(500,225,100,50);
    DataBaseInit();
    connect(this->prevBtn,SIGNAL(clicked(bool)),this,SLOT(on_prevBtn_click()));
    connect(this->nextBtn,SIGNAL(clicked(bool)),this,SLOT(on_nextBtn_click()));

}

Widget::~Widget()
{

}

void Widget::DataBaseInit()
{
    //拼接sql语句
    strcpy(sql,"select * from tb_video");


    SignalDB::getInstance()->getTableBySelect(sql,row,col,datares);

    if(row%3==0)
    {
        this->countPage=row/3;

    }
    else
    {
        this->countPage=row/3+1;
    }
    this->countPageLab->setText(QString::number(countPage));

    //根据数据库数据设置列数
    this->model->setColumnCount(col);
    this->model->setRowCount(3);


    strcpy(sql,"select * from tb_video limit 3 offset 0");


    SignalDB::getInstance()->getTableBySelect(sql,row,col,datares);

    for(int i=0;i<col;i++)
    {
        this->model->setHeaderData(i,Qt::Horizontal,datares[i]);
    }

    for(int i=0;i<row;i++)
    {
        for(int j=0;j<col;j++)
        {
            this->model->setItem(i,j,new QStandardItem(datares[(i+1)*col+j]));
        }
    }
}

void Widget::on_prevBtn_click()
{
    if(this->curPageLab->text().toInt()>1)
    {
        this->model->setRowCount(0);

        int cur=this->curPageLab->text().toInt();
        cur--;
        int index=(cur-1)*3;

        sprintf(sql,"select * from tb_video limit 3 offset %d",index);
        SignalDB::getInstance()->getTableBySelect(sql,row,col,datares);
        for(int i=0;i<row;i++)
        {
            for(int j=0;j<col;j++)
            {
                this->model->setItem(i,j,new QStandardItem(datares[(i+1)*col+j]));
            }
        }
        this->curPageLab->setText(QString::number(cur));
    }
}

void Widget::on_nextBtn_click()
{
    if(this->curPageLab->text().toInt()<this->countPageLab->text().toInt())
    {
        this->model->setRowCount(0);

        int cur=this->curPageLab->text().toInt();
        cur++;
        int index=(cur-1)*3;

        sprintf(sql,"select * from tb_video limit 3 offset %d",index);
        SignalDB::getInstance()->getTableBySelect(sql,row,col,datares);
        for(int i=0;i<row;i++)
        {
            for(int j=0;j<col;j++)
            {
                this->model->setItem(i,j,new QStandardItem(datares[(i+1)*col+j]));
            }
        }
        this->curPageLab->setText(QString::number(cur));
    }
}

结果图展示

在这里插入图片描述

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时光如箫声留念

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值