本例程示範了在将所有資料存儲到成員變量後,根據每頁顯示記錄數量對表格資料進行分頁展示,且提供了切換頁面的按鈕和輸入框。
在支援分頁後,同時處理了表頭的點選事件,将頁面資料進行重排,使用了C++ 11的lamda函數。
在Qt5.14.2中編譯測試通過。
代碼粘貼如下:
main.cpp
#include "dialog.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Dialog w;
w.show();
return a.exec();
}
dialog.h
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACE
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = nullptr);
~Dialog();
void gotoPage(int page);
void gotoPrevPage() {if (pageNum > 1) --pageNum;}
void gotoNextPage() {if (pageNum < pageCount) ++pageNum;}
void gotoFirstPage() {pageNum = 1;}
void gotoLastPage() {pageNum = pageCount;}
void gotoThePage(int num) {pageNum = num;}
private slots:
void sortByColumn(int column);
void on_nextPageBtn_clicked();
void on_prevPageBtn_clicked();
void on_firstPageBtn_clicked();
void on_lastPageBtn_clicked();
void on_goPageBtn_clicked();
private:
void initData();
void updateTable();
Ui::Dialog *ui;
int pageSize;
int pageCount;
int pageNum;
QList<QStringList> dataList;
};
#endif // DIALOG_H
dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"
#include <QDebug>
Dialog::Dialog(QWidget *parent)
: QDialog(parent),
ui(new Ui::Dialog),
pageSize(2),
pageCount(0),
pageNum(1)
{
ui->setupUi(this);
initData();
updateTable();
connect(ui->tableWidget->horizontalHeader(), SIGNAL(sectionClicked(int)), this, SLOT(sortByColumn(int)));
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::initData()
{
// 初始化所有資料
QStringList rowData;
rowData.clear();
rowData << "張三" << "成都市";
dataList.append(rowData);
rowData.clear();
rowData << "李四" << "天津市";
dataList.append(rowData);
rowData.clear();
rowData << "王五" << "南京市";
dataList.append(rowData);
rowData.clear();
rowData << "趙六" << "保定市";
dataList.append(rowData);
rowData.clear();
rowData << "孫七" << "石家莊市";
dataList.append(rowData);
rowData.clear();
rowData << "吳八" << "烏魯木齊市";
dataList.append(rowData);
rowData.clear();
rowData << "楊九" << "邯鄲市";
dataList.append(rowData);
pageCount = dataList.size() / pageSize + (dataList.size() % pageSize ? 1 : 0);
// 初始化表頭
QStringList headerList;
headerList << "姓名" << "位置";
ui->tableWidget->setColumnCount(headerList.size());
ui->tableWidget->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch);
ui->tableWidget->setHorizontalHeaderLabels(headerList);
ui->tableWidget->setSortingEnabled(true);
}
void Dialog::updateTable()
{
ui->spinPageBox->setValue(pageNum);
ui->pageLabel->setText(QString("第 %1 頁 共 %2 頁").arg(pageNum).arg(pageCount));
ui->firstPageBtn->setDisabled(pageNum == 1);
ui->prevPageBtn->setDisabled(pageNum == 1);
ui->lastPageBtn->setDisabled(pageNum == pageCount);
ui->nextPageBtn->setDisabled(pageNum == pageCount);
ui->tableWidget->clearContents();
int minRow = (pageNum - 1) * pageSize;
int maxRow = pageNum * pageSize;
if (maxRow > dataList.size())
{
maxRow = dataList.size();
}
ui->tableWidget->setRowCount(maxRow - minRow);
for(int row = minRow; row < maxRow; row++)
{
QStringList rowList = dataList.at(row);
for (int col = 0; col < rowList.size(); col++)
{
ui->tableWidget->setItem(row - minRow, col, new QTableWidgetItem(rowList.at(col)));
}
}
}
void Dialog::sortByColumn(int column)
{
if(column == -1 || dataList.isEmpty())
return;
const bool isAsc = ui->tableWidget->horizontalHeader()->sortIndicatorOrder() == Qt::AscendingOrder;
std::sort(dataList.begin(), dataList.end(), [column, isAsc, this](const QStringList &left, const QStringList &right){
const QString &leftValue = left.at(column);
const QString &rightValue = right.at(column);
return isAsc ? (leftValue.toLocal8Bit() < rightValue.toLocal8Bit()) : (leftValue.toLocal8Bit() > rightValue.toLocal8Bit());
});
updateTable();
}
void Dialog::on_nextPageBtn_clicked()
{
gotoNextPage();
updateTable();
}
void Dialog::on_prevPageBtn_clicked()
{
gotoPrevPage();
updateTable();
}
void Dialog::on_firstPageBtn_clicked()
{
gotoFirstPage();
updateTable();
}
void Dialog::on_lastPageBtn_clicked()
{
gotoLastPage();
updateTable();
}
void Dialog::on_goPageBtn_clicked()
{
gotoThePage(ui->spinPageBox->value());
updateTable();
}