| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- #ifndef CHATMESSAGEDELEGATE_H
- #define CHATMESSAGEDELEGATE_H
- #include <QHash>
- #include <QPixmap>
- #include <QStyledItemDelegate>
- #include "qpainter.h"
- #include "widgets/chatView/chat1/chatmessage.h"
- #include <QTextDocument>
- class TestWidget : public QWidget
- {
- public:
- TestWidget()
- : m_document(nullptr)
- {}
- QTextDocument *m_document;
- QTextDocument document;
- void setDocument(QTextDocument *doc)
- {
- document.setHtml(doc->toHtml());
- document.setDefaultFont(doc->defaultFont());
- document.setTextWidth(doc->textWidth());
- document.setDefaultTextOption(doc->defaultTextOption());
- m_document = &document;
- update();
- }
- void paintEvent(QPaintEvent *event) override
- {
- QWidget::paintEvent(event);
- if (!m_document)
- return;
- QPainter painter(this);
- painter.setRenderHint(QPainter::Antialiasing);
- painter.setRenderHint(QPainter::TextAntialiasing);
- m_document->drawContents(&painter);
- };
- };
- class ChatMessageDelegate : public QStyledItemDelegate
- {
- Q_OBJECT
- public:
- explicit ChatMessageDelegate(QObject *parent = nullptr);
- int hitTestText(const QPoint &pos, const QString &text) const;
- QSize calculateTextSize(const QFontMetrics &fm, const QString &text) const;
- void setSelectionRange(int start, int end)
- {
- m_selectionStart = start;
- m_selectionEnd = end;
- }
- void setCurrentMessageIndex(const QModelIndex &index) { m_currentMessageIndex = index; }
- int getPositionFromPoint(const QPoint &pos, const QString &text, const QFontMetrics &fm);
- void paint(QPainter *painter,
- const QStyleOptionViewItem &option,
- const QModelIndex &index) const override;
- QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override;
- void setViewportWidth(int width);
- int viewportWidth() const { return m_viewportWidth; }
- private:
- void drawBubble(QPainter *painter, const QRectF &rect, bool isLeft) const;
- void drawAvatar(QPainter *painter, const QRectF &rect, const QString &avatarPath) const;
- void drawTextWithSelection(QPainter *painter,
- const QRectF &rect,
- const QString &text,
- const QFontMetrics &fm,
- bool isCurrentMessage) const;
- // 添加系统消息绘制方法
- void drawSystemMessage(QPainter *painter,
- const QStyleOptionViewItem &option,
- const ChatMessage &message) const;
- QHash<QString, QPixmap> m_avatarCache;
- int m_viewportWidth;
- TestWidget test;
- mutable int m_selectionStart = -1;
- mutable int m_selectionEnd = -1;
- mutable QModelIndex m_currentMessageIndex;
- };
- #endif // CHATMESSAGEDELEGATE_H
|