目录
头文件:DatabaseDataExportDelegate.h
源文件:DatabaseDataExportDelegate.cpp
关键问题处理
背景
使用委托设置表格的单元格后,在model中设置背景颜色不生效。
ui->tableView->setModel(m_pDataModel);
for each (auto var in m_pDataDelegate->GetDelegateColumnIndexs())
{
ui->tableView->setItemDelegateForColumn(var, m_pDataDelegate);
}
QVariant DatabaseDataExportModel::data(const QModelIndex& index, int role) const
{
if (role == Qt::BackgroundRole)
{
if (m_stData[row].bExport && !m_stData[row].bAllEmptyUnexport)
{
return QColor(243, 245, 152);//黄
}
else if (m_stData[row].bExport && m_stData[row].bAllEmptyUnexport)
{
return QColor(247, 193, 236);//粉
}
else
{
return QColor(Qt::white);
}
}
}
原因
因为在委托中重写虚函数paint(),重绘了单元格,导致model产生的样式被覆盖了。
void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override;
解决办法
重绘单元格时,自己画个与单元格一样大的矩形,并添加颜色,这样就是背景颜色了
void DatabaseDataExportDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const
{
if (index.isValid() && m_ColumnIndexs.contains(index.column()))
{
ExportDataUnit* pData = static_cast<ExportDataUnit*>(index.internalPointer());
if (index.column() == c_isExport_col_index)
{
paintSub(painter,
option,
pData->bExport,
pData->bAllEmptyUnexport
? QColor(247, 193, 236) //粉色
: QColor(243, 245, 152), //黄色
QColor(Qt::white));
}
else if (index.column() == c_isEmptyUnexport_col_index)
{
paintSub(painter,
option,
pData->bAllEmptyUnexport,
pData->bExport
? QColor(247, 193, 236) //粉色
: QColor(Qt::white),
pData->bExport
? QColor(243, 245, 152) //黄色
: QColor(Qt::white)
);
}
return;
}
return QStyledItemDelegate::paint(painter, option, index);
}
void DatabaseDataExportDelegate::paintSub(QPainter* painter,
const QStyleOptionViewItem& option,
bool value,
const QColor& checkedColor,
const QColor& uncheckedColor) const
{
//画背景矩形框,并设置颜色
QPen pen;
pen.setBrush(Qt::transparent);
painter->setPen(pen);
QBrush barBackgroundBrush;
barBackgroundBrush.setStyle(Qt::SolidPattern);
barBackgroundBrush.setColor(value ? checkedColor : uncheckedColor);
painter->setBrush(barBackgroundBrush);
painter->drawRect(option.rect);
//画自定义勾选控件外观,这里使用了字库小图标
QFont font = IconHelper::Instance()->GetIconFont();
font.setPointSize(option.font.pointSize() * 2.5);
painter->setFont(font);
painter->setPen(QColor("#00aaff"));
painter->setBrush(option.backgroundBrush);
painter->drawText(option.rect, Qt::AlignCenter, value ? QChar(0xf205) : QChar(0xf204));
}
实现代码
这里附上QT model/view单元格的勾选控件的实现代码,只要两个函数
paint():用来重绘控件
editorEvent():编辑器事件回调函数,用来处理编辑器的鼠标点击、拖拽等事件,实现勾选控件的状态切换(勾选或不勾选)
头文件:DatabaseDataExportDelegate.h
#pragma once
#include <QStyledItemDelegate>
#include "DatabaseDataExport_def.h"
namespace NAMESPACENAME_DATABASE_DATA_EXPORT
{
class DatabaseDataExportDelegate : public QStyledItemDelegate
{
Q_OBJECT
public:
DatabaseDataExportDelegate(QObject* parent = nullptr);
~DatabaseDataExportDelegate();
void paint(QPainter* painter,
const QStyleOptionViewItem& option, const QModelIndex& index) const override;
QList<int> GetDelegateColumnIndexs() const;
protected:
bool editorEvent(QEvent* event, QAbstractItemModel* model,
const QStyleOptionViewItem& option, const QModelIndex& index) override;
private:
QList<int> m_ColumnIndexs;
private:
void DatabaseDataExportDelegate::paintSub(QPainter* painter,
const QStyleOptionViewItem& option,
bool value,
const QColor& checkedColor,
const QColor& uncheckedColor) const;
};
};
源文件:DatabaseDataExportDelegate.cpp
#include "DatabaseDataExportDelegate.h"
#include "ExcelDataUploadDataModel.h"
#include <QCheckBox>
#include "iconhelper.h"
using namespace NAMESPACENAME_DATABASE_DATA_EXPORT;
/*列->是否导出*/
const int c_isExport_col_index = 0;
/*列->空列不导出*/
const int c_isEmptyUnexport_col_index = 1;
QList<int> DatabaseDataExportDelegate::GetDelegateColumnIndexs() const
{
return m_ColumnIndexs;
}
DatabaseDataExportDelegate::DatabaseDataExportDelegate(QObject *parent)
: QStyledItemDelegate(parent)
{
m_ColumnIndexs.push_back(c_isExport_col_index); ///*列->是否导出*/
m_ColumnIndexs.push_back(c_isEmptyUnexport_col_index); ///*列->空列不导出*/
}
DatabaseDataExportDelegate::~DatabaseDataExportDelegate()
{}
void DatabaseDataExportDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const
{
if (index.isValid() && m_ColumnIndexs.contains(index.column()))
{
ExportDataUnit* pData = static_cast<ExportDataUnit*>(index.internalPointer());
if (index.column() == c_isExport_col_index)
{
paintSub(painter,
option,
pData->bExport,
pData->bAllEmptyUnexport
? QColor(247, 193, 236) //粉色
: QColor(243, 245, 152), //黄色
QColor(Qt::white));
}
else if (index.column() == c_isEmptyUnexport_col_index)
{
paintSub(painter,
option,
pData->bAllEmptyUnexport,
pData->bExport
? QColor(247, 193, 236) //粉色
: QColor(Qt::white),
pData->bExport
? QColor(243, 245, 152) //黄色
: QColor(Qt::white)
);
}
return;
}
return QStyledItemDelegate::paint(painter, option, index);
}
void DatabaseDataExportDelegate::paintSub(QPainter* painter,
const QStyleOptionViewItem& option,
bool value,
const QColor& checkedColor,
const QColor& uncheckedColor) const
{
QPen pen;
pen.setBrush(Qt::transparent);
painter->setPen(pen);
QBrush barBackgroundBrush;
barBackgroundBrush.setStyle(Qt::SolidPattern);
barBackgroundBrush.setColor(value ? checkedColor : uncheckedColor);
painter->setBrush(barBackgroundBrush);
painter->drawRect(option.rect);
QFont font = IconHelper::Instance()->GetIconFont();
font.setPointSize(option.font.pointSize() * 2.5);
painter->setFont(font);
painter->setPen(QColor("#00aaff"));
painter->setBrush(option.backgroundBrush);
painter->drawText(option.rect, Qt::AlignCenter, value ? QChar(0xf205) : QChar(0xf204));
}
bool DatabaseDataExportDelegate::editorEvent(QEvent* event, QAbstractItemModel* model,
const QStyleOptionViewItem& option, const QModelIndex& index)
{
if (index.isValid() && m_ColumnIndexs.contains(index.column()))
{
ExportDataUnit* pData = static_cast<ExportDataUnit*>(index.internalPointer());
QEvent::Type eEventType = event->type();
qDebug() << index << ": " << eEventType << endl;
if (index.column() == c_isExport_col_index)
{
static QModelIndex isExport_lastIndex;
if (eEventType == QEvent::MouseButtonPress
|| (eEventType == QEvent::MouseMove && isExport_lastIndex != index))
{
if (eEventType == QEvent::MouseMove && isExport_lastIndex.isValid())//鼠标左键按下拖滑开关
{
model->setData(isExport_lastIndex, !pData->bExport);
}
isExport_lastIndex = index;
model->setData(index, !pData->bExport);
return true;
}
}
else if (index.column() == c_isEmptyUnexport_col_index)
{
static QModelIndex isEmptyUnexport_lastIndex;
if (eEventType == QEvent::MouseButtonPress
|| (eEventType == QEvent::MouseMove && isEmptyUnexport_lastIndex != index))
{
if (eEventType == QEvent::MouseMove && isEmptyUnexport_lastIndex.isValid())//鼠标左键按下拖滑开关
{
model->setData(isEmptyUnexport_lastIndex, !pData->bAllEmptyUnexport);
}
isEmptyUnexport_lastIndex = index;
model->setData(index, !pData->bAllEmptyUnexport);
return true;
}
}
}
return QStyledItemDelegate::editorEvent(event, model, option, index);
}