#include "buttondelegate.h" #include #include ButtonDelegate::ButtonDelegate(QObject *parent) : BaseDelegate(parent) { } void ButtonDelegate::CreateButton(int nCol, QString strBtnText, int nBtnWidth, int nBtnHeight) { stButtonInfo btnInfo; btnInfo.strText = strBtnText; btnInfo.nWidth = nBtnWidth; btnInfo.nHeight = nBtnHeight; m_mapBtnInfo[nCol].append(btnInfo); } void ButtonDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { if(!m_mapBtnInfo.contains(index.column())) { BaseItemDelegate::paint(painter, option, index); return; } QList m_listCol = m_mapBtnInfo.keys(); for(const int& nCol : qAsConst(m_listCol)) { if(index.column() == nCol) { //1.绘制基础背景 PaintBase(painter, option, index); //2.绘制数据相关背景颜色 PaintSpecified(painter, option, index); QStyleOptionViewItem opt = option; initStyleOption(&opt, index); //3.绘制选中背景变色 if(opt.state.testFlag(QStyle::State_Selected)) { painter->fillRect(option.rect, QColor(67, 142, 255, 51)); } //4.绘制按钮 // 获取该列按钮数量 QList listBtnInfo = m_mapBtnInfo.value(nCol); for(int i = 0; i < listBtnInfo.size(); ++i) { painter->save(); // 创建一个 QStyleOptionButton 对象并初始化它 QStyleOptionButton buttonOption; buttonOption.rect = QRect(option.rect.left() + listBtnInfo[i].nWidth * i, option.rect.top(), listBtnInfo[i].nWidth, listBtnInfo[i].nHeight); buttonOption.text = listBtnInfo[i].strText; buttonOption.state |= QStyle::State_Enabled; painter->setBrush(Qt::NoBrush); // 确保没有填充背景 painter->setPen(Qt::transparent); // 确保没有边框 // 手动绘制按钮文本 QColor colorText = QColor("#438EFF"); QFontMetrics metrics(option.font); QRect textRect = metrics.boundingRect(buttonOption.rect, Qt::AlignVCenter | Qt::AlignLeft, buttonOption.text); painter->setPen(colorText); painter->drawText(textRect, Qt::AlignCenter, buttonOption.text); painter->restore(); } } } } bool ButtonDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index) { if(!m_mapBtnInfo.contains(index.column())) { return BaseItemDelegate::editorEvent(event, model, option, index); } if(event->type() == QEvent::MouseButtonRelease) { QMouseEvent *mouseEvent = static_cast(event); // 获取该列所有按钮的信息 QList listBtnInfo = m_mapBtnInfo.value(index.column()); for(int i = 0; i < listBtnInfo.size(); ++i) { // 根据按钮信息计算出每个按钮的矩形区域 QRect buttonRect(option.rect.left() + listBtnInfo[i].nWidth * i, option.rect.top(), listBtnInfo[i].nWidth, listBtnInfo[i].nHeight); // 检查鼠标点击是否在这个按钮的矩形区域内 if(buttonRect.contains(mouseEvent->pos())) { // 发出带有按钮索引或其他唯一标识符的信号 emit SignalButtonClicked(index, i); return true; // 事件已处理 } } } return BaseItemDelegate::editorEvent(event, model, option, index); }