qtableview单元格内添加颜色标记图标
显示效果如下:
双击效果如下:
主要思路是使用 控件委托,代码如下:
#include <QPainter> #include <QFontMetrics> TableDelegate::TableDelegate(QObject* parent) : QStyledItemDelegate(parent) { } TableDelegate::~TableDelegate() { } void TableDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { QStyleOptionViewItem opt(option); // 调整绘图时的初始位置 opt.rect.adjust(0, 0, 0, 0); // 画文字 QStyledItemDelegate::paint(painter, opt, index); // 内部保护,安全验证 if (!index.isValid()) { return; } // 获取颜色值 QString color = index.data().toString(); painter->setBrush(QColor(color)); // 获取字体所占宽度 QFontMetrics fm(painter->font()); int pixelsWide = fm.width(color); // 计算居中位置,画图标(颜色) auto in_wd = (option.rect.width()-pixelsWide-28*2)/2; painter->drawRect(option.rect.x() + in_wd, option.rect.y() + 5, 20, 20); } void TableDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &) const { // 双击时,自适应宽度,进入编辑状态 editor->setGeometry(option.rect); }
外界调用如下:
// 初始化视图 FreezeTableWidget *tableView = new FreezeTableWidget(model); // 设置某列的委托 tableView->setItemDelegateForColumn(1, new TableDelegate(tableView));
if (col==1) { newItem->setText("#808080"); newItem->setTextAlignment(Qt::AlignCenter); } model->setItem(row, col, newItem);