自定义QTableView 多列过滤筛选 、筛选后的item背景标注、表头排序及常用属性

本文主要用于记录,方便后续工作

  • 总结QTableView常用属性设置:
m_ptableview->verticalHeader()->setHidden(true); // 隐藏横向表头
m_ptableview->horizontalHeader()->setStretchLastSection(true); // 表头平铺
m_ptableview->setSelectionBehavior(QAbstractItemView::SelectRows); // 整行选中
m_ptableview->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft); // 表头左侧对齐

m_ptableview->setTextElideMode(Qt::TextElideMode::ElideRight); // 设置省略模式为右侧省略
m_ptableview->verticalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); //根据内容 自动调整行高

// Windows 10 下样式问题 添加表头的外侧线
m_ptableview->horizontalHeader()->setStyleSheet(
		"QHeaderView::section{"
		"border-top:0px solid rgb(218,218,218);"
		"border-left:0px solid rgb(218,218,218);"
		"border-right:1px solid rgb(218,218,218);"
		"border-bottom:1px solid rgb(218,218,218);"
		"background-color:rgb(240,240,240);"
		"padding:1px;"
		"}"
	);
  •  多列过滤(需自定义QSortFilterProxyModel 重写virtual bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const override;)
#pragma once

#include <QSortFilterProxyModel>
class CustomSortFilterProxyModel : public QSortFilterProxyModel
{
	Q_OBJECT

public:
	CustomSortFilterProxyModel(QObject *parent = nullptr);
	~CustomSortFilterProxyModel();

	virtual bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const override;

};
#include "CustomSortFilterProxyModel.h"

CustomSortFilterProxyModel::CustomSortFilterProxyModel(QObject *parent) : QSortFilterProxyModel(parent)
{
	setDynamicSortFilter(true);
	setFilterCaseSensitivity(Qt::CaseInsensitive);
}

CustomSortFilterProxyModel::~CustomSortFilterProxyModel()
{
}

bool CustomSortFilterProxyModel::filterAcceptsRow(int source_row, const QModelIndex& source_parent) const
{
    //获取model中实际的数据
    QString dataColumn0 = sourceModel()->index(source_row, 0, source_parent).data(Qt::DisplayRole).toString();
    QString dataColumn1 = sourceModel()->index(source_row, 1, source_parent).data(Qt::DisplayRole).toString();

    if (dataColumn0.contains(this->filterRegExp()))
    {
        return true;
    }
    else if (dataColumn1.contains(this->filterRegExp()))
    {
        return true;
    }

    return false;
}

.h

protected:
	bool eventFilter(QObject* watched, QEvent* event);

private:
	CusotmSortFilterProxyModel* m_proxyModel = nullptr;


.cpp

    // 创建过滤器
	m_proxyModel = new CusotmSortFilterProxyModel(this);
	m_proxyModel->setSourceModel(m_pDataModel); 

	// 设置表格视图的模型为过滤器
	m_ptableview->setModel(m_proxyModel);



bool ChatAuditWidget::eventFilter(QObject* watched, QEvent* event)
{
if (watched == m_pLineEdit)
	{
		if (event->type() == QEvent::KeyPress)
		{
			QKeyEvent* pKey = static_cast<QKeyEvent*>(event);
			if (pKey->key() == Qt::Key_Return || pKey->key() == Qt::Key_Enter)
			{
				QString text = m_pLineEdit->text();
				// 设置过滤规则
				m_proxyModel->setFilterRegExp(QRegExp(text, Qt::CaseInsensitive, QRegExp::FixedString));

                //m_proxyModel->setFilterKeyColumn(1); //单列过滤
			}
		}
	}
return ChatAuditWidget::eventFilter(watched, event);
}
  •  对筛选出来的包含筛选项的item进行背景标注
#pragma once

#include <QItemDelegate>
#include <QPainter>

class CustomItemDelegate : public QItemDelegate
{
	Q_OBJECT

public:
	CustomItemDelegate(const QColor& color, const QString& text, QObject* parent = nullptr);
	~CustomItemDelegate();

	void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override;

	const QColor _color;
	const QString _text;
};
#include "CustomItemDelegate.h"
#include <QTextDocument>
#include <QStyleOptionViewItem>
#include <QAbstractTextDocumentLayout>
#include <QStyledItemDelegate>

CustomItemDelegate::CustomItemDelegate(const QColor& color, const QString& text, QObject* parent) 
    : QItemDelegate(parent), _color(color),_text(text)
{
}

CustomItemDelegate::~CustomItemDelegate()
{
}

void CustomItemDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const
{
    if (_text.isEmpty())
    {
        QItemDelegate::paint(painter, option, index);
        return;
    }
    else
    {
        if (index.data(Qt::DisplayRole).toString().contains(_text))
        {
            QRect rect = option.rect;
            painter->fillRect(rect, _color);
        }
        QItemDelegate::paint(painter, option, index);
    }
}
// 设置自定义代理
CustomItemDelegate* pDelegate = new CustomItemDelegate(Qt::yellow, text);
m_ptableview->setItemDelegate(pDelegate);

点击tableView表头 排序

// 排序
connect(m_ptableview->horizontalHeader(), &QHeaderView::sectionClicked, this, &ChatAuditWidget::tableWidgetHeadersortItems);

void ChatAuditWidget::tableWidgetHeadersortItems(int column)
{
	if (!m_sortUpDown)
	{
		m_ptableview->sortByColumn(column, Qt::AscendingOrder);
		m_sortUpDown = !m_sortUpDown;
	}
	else
	{
		m_ptableview->sortByColumn(column, Qt::DescendingOrder);
		m_sortUpDown = !m_sortUpDown;
	}
}
要在Qt中为TableView添加列过滤筛选功能,可以使用QSortFilterProxyModel和QLineEdit部件。下面是一个简单的示例: 首先,在头文件中包含必要的头文件: ```cpp #include <QSortFilterProxyModel> #include <QLineEdit> ``` 然后,在TableView的构造函数中创建一个QSortFilterProxyModel对象,并将其设置为TableView的模型: ```cpp QTableView *tableView = new QTableView(this); QSortFilterProxyModel *proxyModel = new QSortFilterProxyModel(this); proxyModel->setSourceModel(model); // model是TableView的数据模型 tableView->setModel(proxyModel); ``` 接下来,创建一个QLineEdit部件,并添加一个文本更改信号的槽函数: ```cpp QLineEdit *filterLineEdit = new QLineEdit(this); connect(filterLineEdit, &QLineEdit::textChanged, [=](const QString &text) { QRegExp regExp(text, Qt::CaseInsensitive, QRegExp::Wildcard); proxyModel->setFilterRegExp(regExp); }); ``` 在这里,我们使用QRegExp对象来设置过滤器正则表达式,确保不区分大小写并使用通配符匹配。然后,将过滤器正则表达式设置为QSortFilterProxyModel对象的过滤器。 最后,将QLineEdit部件添加到视图的布局中: ```cpp QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(filterLineEdit); layout->addWidget(tableView); setLayout(layout); ``` 现在,你已经为TableView添加了列过滤筛选功能。当用户在QLineEdit中输入文本时,TableView中的数据将自动过滤以匹配输入文本。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值