QTableWidget分页和排序

本文介绍了一个使用Qt实现的带有分页功能和排序功能的表格组件案例。该案例使用C++11的lamda表达式来处理表头点击事件,并实现了基于页数的数据展示。代码已在Qt5.14.2环境下验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本例程演示了在将所有数据存储到成员变量后,根据每页显示记录数量对表格数据进行分页展示,且提供了切换页面的按钮和输入框。
在支持分页后,同时处理了表头的点击事件,将页面数据进行重排,使用了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();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值