Qt自定义tableview控件,使用QSortFilterProxyModel进行表格数据过滤与排序

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值