当前位置: 首页 > article >正文

C++ Qt, 使用QTableView,分页功能

好的!使用 QTableView 来实现分页功能是一个很好的选择。以下是一个基于 QTableView 的示例代码,展示如何实现带有分页功能的表格视图。

示例代码

 

cpp

#include <QApplication>
#include <QTableView>
#include <QPushButton>
#include <QVBoxLayout>
#include <QWidget>
#include <QStandardItemModel>
#include <QLabel>

class PaginationWidget : public QWidget {
    Q_OBJECT

public:
    PaginationWidget(QWidget *parent = nullptr);

private slots:
    void onNextPage();
    void onPrevPage();

private:
    void updateTable();

    QTableView *tableView;
    QStandardItemModel *model;
    QLabel *pageLabel;
    int currentPage;           // 当前页码
    const int itemsPerPage;    // 每页显示的条目数
};

PaginationWidget::PaginationWidget(QWidget *parent) 
    : QWidget(parent), currentPage(0), itemsPerPage(5) {
    tableView = new QTableView(this);
    model = new QStandardItemModel(this);

    model->setRowCount(20);  // 假设总共有20条数据
    model->setColumnCount(3); // 三列数据标头
    model->setHorizontalHeaderLabels(QStringList() << "编号" << "名称" << "描述");
    
    // 初始化模型数据
    for (int i = 0; i < 20; ++i) {
        model->setItem(i, 0, new QStandardItem(QString::number(i + 1)));
        model->setItem(i, 1, new QStandardItem(QString("Item %1").arg(i + 1)));
        model->setItem(i, 2, new QStandardItem("Details"));
    }
    
    tableView->setModel(model);
    tableView->setSelectionMode(QAbstractItemView::SingleSelection);
    
    // 创建分页控件
    QPushButton *prevButton = new QPushButton("上一页", this);
    QPushButton *nextButton = new QPushButton("下一页", this);
    pageLabel = new QLabel(this);
    
    connect(prevButton, &QPushButton::clicked, this, &PaginationWidget::onPrevPage);
    connect(nextButton, &QPushButton::clicked, this, &PaginationWidget::onNextPage);
    
    QVBoxLayout *layout = new QVBoxLayout(this);
    layout->addWidget(tableView);
    layout->addWidget(prevButton);
    layout->addWidget(nextButton);
    layout->addWidget(pageLabel);
    
    updateTable(); // 初始化显示的数据
}

void PaginationWidget::updateTable() {
    int totalItems = model->rowCount();
    int startRow = currentPage * itemsPerPage;
    int endRow = std::min(startRow + itemsPerPage, totalItems);
    
    for (int i = 0; i < totalItems; ++i) {
        tableView->setRowHidden(i, i < startRow || i >= endRow);
    }

    pageLabel->setText(QString("当前页: %1").arg(currentPage + 1));
}

void PaginationWidget::onNextPage() {
    int totalItems = model->rowCount();
    if ((currentPage + 1) * itemsPerPage < totalItems) {
        currentPage++;
        updateTable();
    }
}

void PaginationWidget::onPrevPage() {
    if (currentPage > 0) {
        currentPage--;
        updateTable();
    }
}

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);
    
    PaginationWidget w;
    w.setWindowTitle("QTableView 分页示例");
    w.resize(400, 300);
    w.show();

    return a.exec();
}

#include "main.moc"

cpp

代码解释

  1. 模型 (QStandardItemModel):

    • 使用 QStandardItemModel 来存储数据。
    • 初始化模型20行数据,每行有3个列(编号、名称、描述)。
  2. 视图 (QTableView):

    • 使用 QTableView 来展示 QStandardItemModel 中的数据。
  3. 分页逻辑:

    • currentPage 变量跟踪当前页码。
    • itemsPerPage 确定每页显示5条数据。
    • updateTable() 函数根据当前页码来更新视图中可见的行。
  4. UI 控件:

    • 使用 QPushButton 创建“上一页”和“下一页”按钮。
    • 使用 QLabel 显示当前页码。

用户交互

  • 当用户点击“上一页”或“下一页”按钮时,程序会更新当前页码,并重新渲染视图。
  • 页码显示在底部标签中。

注意事项

  • 在实际应用中,你可能需要处理更多的数据和更复杂的分页逻辑,比如总页数显示等。
  • 也可以通过信号与槽机制,对按钮的启用/禁用状态进行控制,确保用户操作的顺序正确。

通过这样的实现,你就可以在 Qt 应用程序中方便的管理和展示分页数据了。希望这对你有帮助!


http://www.kler.cn/a/509083.html

相关文章:

  • Spark任务提交流程
  • K8S开启/关闭审计日志
  • 计算机网络 (47)应用进程跨越网络的通信
  • vue编写一个可拖动的模块,并可以和任何其他组件组合使用
  • Java21 正则表达式
  • python之二维几何学习笔记
  • 使用ffmpeg提高mp4压缩比,减小文件体积【windows+ffmpeg+batch脚本】
  • openssl在windows下的编译
  • 打破编程“鄙视链”:探索行业发展新路径
  • vim函数定义跳转相关设置
  • 如何在亚马逊云科技上消除无服务器网页应用冷启动时间(下篇)
  • Selenium自动化测试实战
  • 红队可视化工具:网络安全的“透视眼”
  • 3. 后端验证前端Token
  • 【BUUCTF】[GXYCTF2019]BabySQli
  • ansible自动化运维实战--服务端安装、环境配置与测试(1)
  • C语言编程笔记:文件处理的艺术
  • [Qt] Box Model | 控件样式 | 实现log_in界面
  • JavaScript 中的 `find` 方法
  • Ardupilot开源无人机之Geek SDK进展2024-2025
  • LabVIEW 蔬菜精密播种监测系统
  • 数据分析的新利器-微软开源的GraphRAG
  • 搭建Hadoop源代码阅读环境
  • vscode项目依赖问题
  • 网络编程 | UDP广播通信
  • 渗透测试之越权漏洞详解 水平越权 垂直越权 目录越权 SQL跨库查询越权 以及未授权漏洞 一篇文章说明白