天天看點

QTableWidget分頁和排序

本例程示範了在将所有資料存儲到成員變量後,根據每頁顯示記錄數量對表格資料進行分頁展示,且提供了切換頁面的按鈕和輸入框。

在支援分頁後,同時處理了表頭的點選事件,将頁面資料進行重排,使用了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();
}

           

繼續閱讀