QTableWidget,QTableView分页(2)——使用分页栏

来源:互联网 发布:中国梦之队服装淘宝网 编辑:程序博客网 时间:2024/06/06 00:27

  • 一新建QTableWidget
  • 二加入分页栏
  • 三调度逻辑
  • 四下载连接及一点点话

 承接上文,这篇主要是讲如何使用分页栏,其实也不用多说的,但demo都写了,不妨就简单介绍下吧。

效果预览:
这里写图片描述

在这里只介绍了一个分页栏的,因为都一样,接口函数,用法完全一模一样,所以没必要。且table用的是QTableWidget,QTableView也是一样的道理。

开发环境:windows7 + vs2015 + QT5.8

一、新建QTableWidget:


1、新建项目: 略
2、新建TableWidgetForm:设置个布局,最好是垂直布局。
附图:
这里写图片描述

3、处理tablewidget:
初始化:

void TableWidgetForm::Init(){    QStringList headers;    headers<<QObject::tr("rid")          <<QObject::tr("userid")         <<QObject::tr("name");    this->ui->tableWidget->setColumnCount(headers.size());//列数量    this->ui->tableWidget->setHorizontalHeaderLabels(headers);//列名称    this->ui->tableWidget->setAlternatingRowColors(true);//行间隔色    this->ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);//自动列宽    this->ui->tableWidget->installEventFilter(this);}

更新表格行数据:

void TableWidgetForm::UpdateRows(UserData *data, int row){    if(!data || row < 0)        return;    int colindex = 0;    this->ui->tableWidget->setItem(row, colindex++,                                   new QTableWidgetItem(QString::fromStdString(data->RID)));    this->ui->tableWidget->setItem(row, colindex++,                                   new QTableWidgetItem(QString::fromStdString(data->UserID)));    this->ui->tableWidget->setItem(row, colindex++,                                   new QTableWidgetItem(QString::fromStdString(data->UserName)));}

表格对应数据:

struct UserData{    std::string RID;    std::string UserID;    std::string UserName;};

二、加入分页栏:

  添加到页面里就很简单了,上一个demo有,我就直接抛个代码:

    this->PagingWidget_ = new PagingWidget();    connect(PagingWidget_, &PagingWidget::SignalCurrentPageChanged,            this, &TableWidgetForm::SlotCurrentPageChanged);    this->layout()->addWidget(this->PagingWidget_);

这样就已经完成了把分页栏加到页面的任务,还差啥呢?
就查初始化分页栏页数,以及写好 TableWidgetForm::SlotCurrentPageChanged这个接受分页栏页面改变时的信号,做出表格相应的改变。
初始化分页栏,首先是要根据已有的数据,以及设定好每页的行数,和总行数来分配。
初始化分页栏:

//设置分页栏信息void TableWidgetForm::SetPages(int rows, int totalRows){    if(rows < 0 || totalRows < 0)        return;    int offset = (totalRows % rows) > 0 ? 1 : 0;    //计算总页数    this->Pages_ = totalRows / rows + offset;    //总行数    this->TotalRows_ = totalRows;    //每页行数    this->EachRows_ = rows;    //设置分页栏最大页面数    this->PagingWidget_->SetMaxPage(this->Pages_);}

页面改变回调:

//当前页回调void TableWidgetForm::SlotCurrentPageChanged(int page){    //根据当前页决定要显示数据范围    int rowstart = (page - 1) * this->EachRows_;    int rowend = page * this->EachRows_ - 1;    //根据起点和终点行更新表格页面    this->UpdateTable(rowstart, rowend);}

三、调度逻辑:

1、根据起点和终点行更新表格页面:

void TableWidgetForm::UpdateTable(int startRow, int endRow){    //必须先清空表格显示内容    this->ClearTable();    int row = 0;    for(int i = startRow; i < this->DataList_.size(); ++i)    {        if(i > endRow)//超出范围            break;        UserData *data = this->DataList_.at(i);        if(data)        {            this->ui->tableWidget->insertRow(row);            this->UpdateRows(data, row);            row++;        }    }}

2、清空表格数据:

void TableWidgetForm::ClearTable(){    //清空表格数据    this->ui->tableWidget->setRowCount(0);    this->ui->tableWidget->clearContents();}

到这里,基本上所有逻辑都完成了,那么我们再加一个根据每页行数和总行数生成数据的函数就可以测试了。
3、生成表格数据:

//初始化表格数据void TableWidgetForm::InitTable(int rows, int totalRows){    if(rows < 0 || totalRows < 0)        return;    //根据条件创建对应的表格数据    int show = 1,count = 0;    std::string tmpstr = std::to_string(show);;    for(int i = 0; i < totalRows; ++i)    {        if(count == rows)        {            tmpstr = std::to_string(++show);            count = 0;        }        UserData *data = new UserData();        data->RID = tmpstr;        data->UserID = tmpstr;        data->UserName = tmpstr;        this->DataList_.push_back(data);        count ++;    }    //设置分页栏页面数据    this->SetPages(rows, totalRows);    this->SlotCurrentPageChanged(1);}

结果如序章所示。

四、下载连接及一点点话:

代码地址:
传送门

我们其实可以进一步封装,把QTableWidget和分页栏封装在一起,封装成自定义的table控件,提供一些重载接口,这样能够更方便让人使用以及将来复用。当然,这需要自己去做了。

原创粉丝点击