qt C++ tablewidget 分页显示
时间: 2023-08-25 10:07:33 浏览: 339
在Qt中,可以使用QTableWidget组件来显示表格数据。要实现分页显示,可以使用QTableView组件和QAbstractItemModel模型类。下面是一个简单的示例:
1. 创建一个QTableView组件和一个分页控件QPaginator。
2. 创建一个自定义的TableModel类,继承自QAbstractItemModel类,用于管理表格数据。
3. 在TableModel类中实现rowCount()和columnCount()方法,返回表格的行数和列数。
4. 在TableModel类中实现data()方法,用于返回指定单元格的数据。
5. 在主窗口中,将QTableView组件设置为TableModel类的视图,并将分页控件绑定到TableModel类的槽函数中。
下面是完整的示例代码:
```
// tablemodel.h
#include <QAbstractItemModel>
class TableModel : public QAbstractItemModel
{
Q_OBJECT
public:
explicit TableModel(QObject *parent = nullptr);
int rowCount(const QModelIndex &parent) const override;
int columnCount(const QModelIndex &parent) const override;
QVariant data(const QModelIndex &index, int role) const override;
private:
QStringList m_headers;
QList<QStringList> m_data;
};
// tablemodel.cpp
#include "tablemodel.h"
TableModel::TableModel(QObject *parent) : QAbstractItemModel(parent)
{
m_headers << "Name" << "Age" << "Gender" << "City" << "Country";
QList<QStringList> data;
data << (QStringList() << "Alice" << "25" << "Female" << "New York" << "USA");
data << (QStringList() << "Bob" << "30" << "Male" << "London" << "UK");
data << (QStringList() << "Charlie" << "27" << "Male" << "Paris" << "France");
data << (QStringList() << "David" << "35" << "Male" << "Tokyo" << "Japan");
data << (QStringList() << "Emily" << "22" << "Female" << "Sydney" << "Australia");
m_data = data;
}
int TableModel::rowCount(const QModelIndex &parent) const
{
Q_UNUSED(parent);
return m_data.count();
}
int TableModel::columnCount(const QModelIndex &parent) const
{
Q_UNUSED(parent);
return m_headers.count();
}
QVariant TableModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();
if (role == Qt::DisplayRole) {
return m_data[index.row()][index.column()];
}
return QVariant();
}
// mainwindow.h
#include <QMainWindow>
#include <QTableView>
#include <QPaginator>
#include "tablemodel.h"
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
TableModel *m_model;
QTableView *m_view;
QPaginator *m_paginator;
int m_pageSize = 2;
private slots:
void loadPage(int page);
};
// mainwindow.cpp
#include "mainwindow.h"
#include <QVBoxLayout>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
m_model = new TableModel(this);
m_view = new QTableView(this);
m_view->setModel(m_model);
m_paginator = new QPaginator(this);
m_paginator->setPageCount(qCeil(m_model->rowCount(QModelIndex()) / (double)m_pageSize));
connect(m_paginator, &QPaginator::currentPageChanged, this, &MainWindow::loadPage);
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(m_view);
layout->addWidget(m_paginator);
QWidget *centralWidget = new QWidget(this);
centralWidget->setLayout(layout);
setCentralWidget(centralWidget);
loadPage(0);
}
MainWindow::~MainWindow()
{
}
void MainWindow::loadPage(int page)
{
int start = page * m_pageSize;
int end = qMin(start + m_pageSize, m_model->rowCount(QModelIndex()));
QModelIndex parent;
beginResetModel();
for (int i = 0; i < m_model->rowCount(parent); i++) {
QModelIndex index = m_model->index(i, 0, parent);
bool isVisible = i >= start && i < end;
m_view->setRowHidden(i, !isVisible);
}
endResetModel();
m_paginator->setPageCount(qCeil(m_model->rowCount(QModelIndex()) / (double)m_pageSize));
m_paginator->setCurrentPage(page);
}
```
在这个示例中,我们使用QPaginator组件来实现分页效果。在loadPage()槽函数中,我们根据当前页数计算出要显示的行数范围,然后将不需要显示的行隐藏起来。使用beginResetModel()和endResetModel()函数可以保证在隐藏行时不会导致视图更新。最后,我们更新分页控件的页数和当前页数。
阅读全文