重绘QT model/view单元格的勾选控件

目录

关键问题处理

背景

原因

解决办法

实现代码

头文件: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);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值