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

发布于:2025-02-10 ⋅ 阅读:(161) ⋅ 点赞:(0)

好的!使用 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 应用程序中方便的管理和展示分页数据了。希望这对你有帮助!


网站公告

今日签到

点亮在社区的每一天
去签到