本文主要用于记录,方便后续工作
- 总结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;
}
}