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
代码解释
-
模型 (
QStandardItemModel
):- 使用
QStandardItemModel
来存储数据。 - 初始化模型20行数据,每行有3个列(编号、名称、描述)。
- 使用
-
视图 (
QTableView
):- 使用
QTableView
来展示QStandardItemModel
中的数据。
- 使用
-
分页逻辑:
currentPage
变量跟踪当前页码。itemsPerPage
确定每页显示5条数据。updateTable()
函数根据当前页码来更新视图中可见的行。
-
UI 控件:
- 使用
QPushButton
创建“上一页”和“下一页”按钮。 - 使用
QLabel
显示当前页码。
- 使用
用户交互
- 当用户点击“上一页”或“下一页”按钮时,程序会更新当前页码,并重新渲染视图。
- 页码显示在底部标签中。
注意事项
- 在实际应用中,你可能需要处理更多的数据和更复杂的分页逻辑,比如总页数显示等。
- 也可以通过信号与槽机制,对按钮的启用/禁用状态进行控制,确保用户操作的顺序正确。
通过这样的实现,你就可以在 Qt 应用程序中方便的管理和展示分页数据了。希望这对你有帮助!