tableview由两部分组成model/view,model部分用于表格数据的处理,view部分用于表格显示样式的定义。
model部分代码:
//pagetablemodel.h
#ifndef PAGETABLEMODEL_H
#define PAGETABLEMODEL_H
#include <QObject>
#include <QAbstractTableModel>
#include <QSortFilterProxyModel>
class PageTableModel : public QAbstractTableModel
{
Q_OBJECT
public:
PageTableModel(QObject *parent = nullptr);
// 添加一个函数用于设置数据
// void setData(const QVector<QStringList>& data);
// 实现 QAbstractTableModel 接口
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
int columnCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
private:
// QVector<QVector<QString>> modelData;
QVector<QStringList> modelData;
};
#endif // PAGETABLEMODEL_H
//pagetablemodel.cpp
#include "pagetablemodel.h"
PageTableModel::PageTableModel(QObject *parent)
: QAbstractTableModel(parent)
{
// 初始化模型数据
// 示例数据,你可以根据实际情况修改
int rowCount = 1000;
int colCount = 16;
// 循环插入数据
for (int row = 0; row < rowCount; ++row) {
// 创建一个 QStringList 以存储每行的数据
QStringList rowData;
// 循环生成每列的数据
for (int col = 0; col < colCount; ++col) {
// 生成您的字符数据,这里我简单地使用了行列的索引
QString data = QString("%1%2").arg(row + 1).arg(col + 1);
// 将数据添加到当前行
rowData << data;
}
// 将当前行的数据添加到 QVector
modelData << rowData;
}
}
// void PageTableModel::setData(const QVector<QStringList>& data)
// {
// modelData = data;
// // 如果数据变化,通知视图更新
// emit dataChanged(index(0, 0), index(rowCount() - 1, columnCount() - 1));
// }
int PageTableModel::rowCount(const QModelIndex &parent) const
{
if (parent.isValid())
return 0;
return modelData.size();
}
int PageTableModel::columnCount(const QModelIndex &parent) const
{
if (parent.isValid())
return 0;
// 假设每行有3列
return 16;
}
QVariant PageTableModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();
if (role == Qt::DisplayRole)
{
int row = index.row();
int column = index.column();
if (row < modelData.size() && column < modelData[row].size())
return modelData[row][column];
}
return QVariant();
}
view部分代码:
//pagetableview.h
#ifndef PAGETABLEVIEW_H
#define PAGETABLEVIEW_H
#include <QObject>
#include <QtWidgets>
#include <QTableView>
#include "pagetablemodel.h"
#include <QSortFilterProxyModel>
class PageTableView : public QTableView
{
Q_OBJECT
public:
PageTableView(QWidget *parent = nullptr);
PageTableModel *getModel()
{
return m_model;
}
public slots:
void slotTextChange(const QString &text);
private:
void setStyle();
private:
PageTableModel* m_model;
QSortFilterProxyModel* proxyModel;
};
#endif // PAGETABLEVIEW_H
//pagetableview.cpp
#include "pagetableview.h"
PageTableView::PageTableView(QWidget *parent) : QTableView(parent){
m_model = new PageTableModel();
proxyModel = new QSortFilterProxyModel(this);
proxyModel->setSourceModel(m_model);
setSortingEnabled(true);
proxyModel->setFilterKeyColumn(0); // Set the filter column to the first column (ID)
setModel(proxyModel);
// setModel(m_model); //error write
setStyle();
}
void PageTableView::slotTextChange(const QString &text)
{
proxyModel->setFilterRegExp(QRegExp(text, Qt::CaseInsensitive));
}
void PageTableView::setStyle()
{
setAlternatingRowColors(true);
this->horizontalHeader()->setStretchLastSection(true);
this->setSelectionMode(QAbstractItemView::SingleSelection);
this->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Interactive);
this->setStyleSheet("QTableView{border: 1px solid rgb(230, 230, 230);background: rgb(255, 255, 255);gridline-color: rgb(230, 230, 230);}");
this->horizontalHeader()->setFixedHeight(30);
this->horizontalHeader()->setStyleSheet("font: bold 13px;font-family:'Microsoft YaHei UI';");
this->verticalHeader()->setMinimumSectionSize(25);
for(int i=0;i<m_model->rowCount();i++){
this->verticalHeader()->resizeSection(i,25);
}
for(int i=0;i<m_model->columnCount();i++){
this->horizontalHeader()->setSectionResizeMode(i, QHeaderView::Interactive);
}
}
表格与输入框组合:
//pagetable.cpp
#include "pagetable.h"
PageTable::PageTable(QWidget *parent)
: QWidget(parent)
{
// // 创建模型和代理模型
tableView = new PageTableView(this);
// model = new PageTableModel(this);
// proxyModel = new QSortFilterProxyModel(this);
// proxyModel->setSourceModel(model);
// // 设置过滤键列
// proxyModel->setFilterKeyColumn(0);
// // // 创建表格视图
// tableView->setModel(proxyModel);
// tableView->setSortingEnabled(true);
// 创建过滤输入框
filterLineEdit = new QLineEdit(this);
filterLineEdit->setPlaceholderText("Enter filter text...");
// 设置布局
QVBoxLayout *layout = new QVBoxLayout(this);
layout->addWidget(filterLineEdit);
layout->addWidget(tableView);
// 连接过滤输入框的文本变化信号到过滤槽函数
connect(filterLineEdit, &QLineEdit::textChanged, this, &PageTable::setFilter);
connect(this,&PageTable::signalTextChange,tableView,&PageTableView::slotTextChange);
}
void PageTable::setFilter(const QString &text)
{
// 设置代理模型的过滤字符串
// proxyModel->setFilterRegExp(QRegExp(text, Qt::CaseInsensitive));
qDebug()<<"text:"<<text;
emit signalTextChange(text);
}
完整代码下载:
https://download.youkuaiyun.com/download/weixin_43129963/88782019?spm=1001.2014.3001.5503