buttondelegate.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #include "buttondelegate.h"
  2. #include <QPainter>
  3. #include <QMouseEvent>
  4. ButtonDelegate::ButtonDelegate(QObject *parent)
  5. : BaseDelegate(parent)
  6. {
  7. }
  8. void ButtonDelegate::CreateButton(int nCol, QString strBtnText, int nBtnWidth, int nBtnHeight)
  9. {
  10. stButtonInfo btnInfo;
  11. btnInfo.strText = strBtnText;
  12. btnInfo.nWidth = nBtnWidth;
  13. btnInfo.nHeight = nBtnHeight;
  14. m_mapBtnInfo[nCol].append(btnInfo);
  15. }
  16. void ButtonDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
  17. {
  18. if(!m_mapBtnInfo.contains(index.column()))
  19. {
  20. BaseItemDelegate::paint(painter, option, index);
  21. return;
  22. }
  23. QList<int> m_listCol = m_mapBtnInfo.keys();
  24. for(const int& nCol : qAsConst(m_listCol))
  25. {
  26. if(index.column() == nCol)
  27. {
  28. //1.绘制基础背景
  29. PaintBase(painter, option, index);
  30. //2.绘制数据相关背景颜色
  31. PaintSpecified(painter, option, index);
  32. QStyleOptionViewItem opt = option;
  33. initStyleOption(&opt, index);
  34. //3.绘制选中背景变色
  35. if(opt.state.testFlag(QStyle::State_Selected))
  36. {
  37. painter->fillRect(option.rect, QColor(67, 142, 255, 51));
  38. }
  39. //4.绘制按钮
  40. // 获取该列按钮数量
  41. QList<stButtonInfo> listBtnInfo = m_mapBtnInfo.value(nCol);
  42. for(int i = 0; i < listBtnInfo.size(); ++i)
  43. {
  44. painter->save();
  45. // 创建一个 QStyleOptionButton 对象并初始化它
  46. QStyleOptionButton buttonOption;
  47. buttonOption.rect = QRect(option.rect.left() + listBtnInfo[i].nWidth * i,
  48. option.rect.top(), listBtnInfo[i].nWidth, listBtnInfo[i].nHeight);
  49. buttonOption.text = listBtnInfo[i].strText;
  50. buttonOption.state |= QStyle::State_Enabled;
  51. painter->setBrush(Qt::NoBrush); // 确保没有填充背景
  52. painter->setPen(Qt::transparent); // 确保没有边框
  53. // 手动绘制按钮文本
  54. QColor colorText = QColor("#438EFF");
  55. QFontMetrics metrics(option.font);
  56. QRect textRect = metrics.boundingRect(buttonOption.rect, Qt::AlignVCenter | Qt::AlignLeft, buttonOption.text);
  57. painter->setPen(colorText);
  58. painter->drawText(textRect, Qt::AlignCenter, buttonOption.text);
  59. painter->restore();
  60. }
  61. }
  62. }
  63. }
  64. bool ButtonDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
  65. {
  66. if(!m_mapBtnInfo.contains(index.column()))
  67. {
  68. return BaseItemDelegate::editorEvent(event, model, option, index);
  69. }
  70. if(event->type() == QEvent::MouseButtonRelease)
  71. {
  72. QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
  73. // 获取该列所有按钮的信息
  74. QList<stButtonInfo> listBtnInfo = m_mapBtnInfo.value(index.column());
  75. for(int i = 0; i < listBtnInfo.size(); ++i)
  76. {
  77. // 根据按钮信息计算出每个按钮的矩形区域
  78. QRect buttonRect(option.rect.left() + listBtnInfo[i].nWidth * i,
  79. option.rect.top(),
  80. listBtnInfo[i].nWidth,
  81. listBtnInfo[i].nHeight);
  82. // 检查鼠标点击是否在这个按钮的矩形区域内
  83. if(buttonRect.contains(mouseEvent->pos()))
  84. {
  85. // 发出带有按钮索引或其他唯一标识符的信号
  86. emit SignalButtonClicked(index, i);
  87. return true; // 事件已处理
  88. }
  89. }
  90. }
  91. return BaseItemDelegate::editorEvent(event, model, option, index);
  92. }