chatmessagedelegate.h 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #ifndef CHATMESSAGEDELEGATE_H
  2. #define CHATMESSAGEDELEGATE_H
  3. #include <QHash>
  4. #include <QPixmap>
  5. #include <QStyledItemDelegate>
  6. #include "qpainter.h"
  7. #include "widgets/chatView/chat1/chatmessage.h"
  8. #include <QTextDocument>
  9. class TestWidget : public QWidget
  10. {
  11. public:
  12. TestWidget()
  13. : m_document(nullptr)
  14. {}
  15. QTextDocument *m_document;
  16. QTextDocument document;
  17. void setDocument(QTextDocument *doc)
  18. {
  19. document.setHtml(doc->toHtml());
  20. document.setDefaultFont(doc->defaultFont());
  21. document.setTextWidth(doc->textWidth());
  22. document.setDefaultTextOption(doc->defaultTextOption());
  23. m_document = &document;
  24. update();
  25. }
  26. void paintEvent(QPaintEvent *event) override
  27. {
  28. QWidget::paintEvent(event);
  29. if (!m_document)
  30. return;
  31. QPainter painter(this);
  32. painter.setRenderHint(QPainter::Antialiasing);
  33. painter.setRenderHint(QPainter::TextAntialiasing);
  34. m_document->drawContents(&painter);
  35. };
  36. };
  37. class ChatMessageDelegate : public QStyledItemDelegate
  38. {
  39. Q_OBJECT
  40. public:
  41. explicit ChatMessageDelegate(QObject *parent = nullptr);
  42. int hitTestText(const QPoint &pos, const QString &text) const;
  43. QSize calculateTextSize(const QFontMetrics &fm, const QString &text) const;
  44. void setSelectionRange(int start, int end)
  45. {
  46. m_selectionStart = start;
  47. m_selectionEnd = end;
  48. }
  49. void setCurrentMessageIndex(const QModelIndex &index) { m_currentMessageIndex = index; }
  50. int getPositionFromPoint(const QPoint &pos, const QString &text, const QFontMetrics &fm);
  51. void paint(QPainter *painter,
  52. const QStyleOptionViewItem &option,
  53. const QModelIndex &index) const override;
  54. QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override;
  55. void setViewportWidth(int width);
  56. int viewportWidth() const { return m_viewportWidth; }
  57. private:
  58. void drawBubble(QPainter *painter, const QRectF &rect, bool isLeft) const;
  59. void drawAvatar(QPainter *painter, const QRectF &rect, const QString &avatarPath) const;
  60. void drawTextWithSelection(QPainter *painter,
  61. const QRectF &rect,
  62. const QString &text,
  63. const QFontMetrics &fm,
  64. bool isCurrentMessage) const;
  65. // 添加系统消息绘制方法
  66. void drawSystemMessage(QPainter *painter,
  67. const QStyleOptionViewItem &option,
  68. const ChatMessage &message) const;
  69. // 添加图片渲染方法
  70. void drawImage(QPainter *painter, const QRectF &rect, const QString &imagePath) const;
  71. QSize calculateImageSize(const QString &imagePath, int maxWidth, int maxHeight) const;
  72. QSize calculateContentSize(const ChatMessage &message, const QFontMetrics &fm) const;
  73. QHash<QString, QPixmap> m_avatarCache;
  74. mutable QHash<QString, QPixmap> m_imageCache; // 图片缓存
  75. int m_viewportWidth;
  76. TestWidget test;
  77. mutable int m_selectionStart = -1;
  78. mutable int m_selectionEnd = -1;
  79. mutable QModelIndex m_currentMessageIndex;
  80. };
  81. #endif // CHATMESSAGEDELEGATE_H