我想个性化第三列以包含 QCheckBox 小部件。我希望使用三个图标自定义那些 QCheckBox 小部件: 1.png(默认状态)| 2.png(选中状态) | 3.png(禁用状态)。所以我可以使用具有以下实现的自定义委托来做到这一点:
#include "mydelegate.h"
#include <QCheckBox>
#include <QPainter>
#include <QKeyEvent>
#include <QtDebug>
#include <QApplication>
#include <QStyleOptionViewItem>
MyDelegate::MyDelegate(QObject* parent) :
QStyledItemDelegate(parent)
{
// 1.png
_icon.addPixmap(QPixmap("1.png"), QIcon::Active, QIcon::On);
// 2.png
_icon.addPixmap(QPixmap("2.png"), QIcon::Selected, QIcon::On);
// 3.png
_icon.addPixmap(QPixmap("3.png"), QIcon::Disabled, QIcon::On);
}
void MyDelegate::paint(QPainter* painter, const QStyleOptionViewItem&
option, const QModelIndex& index) const
{
if (index.column() != 2)
QStyledItemDelegate::paint(painter, option, index);
else
{
bool value = index.model()->data(index,
Qt::UserRole).toBool();
QStyleOptionButton buttonVis;
buttonVis.rect = option.rect;
buttonVis.iconSize = QSize(50, 50);
buttonVis.icon = _icon;
buttonVis.features |= QStyleOptionButton::Flat;
buttonVis.state |= value ? QStyle::State_Enabled : QStyle::State_None;
QApplication::style()->drawControl(QStyle::CE_PushButton, &buttonVis, painter);
}
}
bool MyDelegate::editorEvent(QEvent* event, QAbstractItemModel* model,
const QStyleOptionViewItem& option, const QModelIndex& index)
{
if (event->type() == QEvent::MouseButtonRelease)
{
bool value = model->data(index, Qt::UserRole).toBool();
model->setData(index, !value, Qt::UserRole);
}
return true;
}
它适用于 1.png 和 3.png 而不适用于 2.png 的问题。我希望它适用于三个图标