123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- #include "buttondelegate.h"
- #include <QPainter>
- #include <QMouseEvent>
- 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<int> 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<stButtonInfo> 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<QMouseEvent*>(event);
- // 获取该列所有按钮的信息
- QList<stButtonInfo> 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);
- }
|