chatwindow.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. #ifndef CHATWINDOW_H
  2. #define CHATWINDOW_H
  3. #include <QDateTime>
  4. #include <QFileDialog>
  5. #include <QHBoxLayout>
  6. #include <QLineEdit>
  7. #include <QMainWindow>
  8. #include <QPushButton>
  9. #include <QVBoxLayout>
  10. #include <QCloseEvent>
  11. #include <QTextEdit>
  12. #include <QLabel>
  13. #include <QScrollArea>
  14. #include <QMimeData>
  15. #include <QDragEnterEvent>
  16. #include <QDropEvent>
  17. #include <QPixmap>
  18. #include <QContextMenuEvent>
  19. #include <QMap>
  20. #include <QTimer>
  21. #include "network/websocketclient.h"
  22. class ChatView;
  23. // 多格式输入框类
  24. class MultiFormatInputEdit : public QTextEdit
  25. {
  26. Q_OBJECT
  27. public:
  28. explicit MultiFormatInputEdit(QWidget *parent = nullptr);
  29. // 获取纯文本内容
  30. QString getPlainText() const;
  31. // 获取所有图片路径
  32. QStringList getImagePaths() const;
  33. // 添加图片到输入框
  34. void insertImage(const QString &imagePath);
  35. // 清空内容
  36. void clearContent();
  37. // 验证输入内容
  38. bool validateContent() const;
  39. // 移除指定图片
  40. void removeImage(const QString &imagePath);
  41. signals:
  42. void contentChanged();
  43. void imageInserted(const QString &imagePath);
  44. void imageRemoved(const QString &imagePath);
  45. void sendRequested();
  46. protected:
  47. void dragEnterEvent(QDragEnterEvent *event) override;
  48. void dropEvent(QDropEvent *event) override;
  49. void keyPressEvent(QKeyEvent *event) override;
  50. void insertFromMimeData(const QMimeData *source) override;
  51. void contextMenuEvent(QContextMenuEvent *event) override;
  52. private slots:
  53. void onTextChanged();
  54. private:
  55. QStringList m_imagePaths;
  56. QMap<QString, QString> m_imageResourceMap; // 图片路径到资源名称的映射
  57. void processImageData(const QByteArray &imageData, const QString &format = "PNG");
  58. bool isImageFormat(const QString &fileName) const;
  59. QString saveImageToTemp(const QPixmap &pixmap, const QString &format = "PNG");
  60. void insertImageIntoDocument(const QString &imagePath);
  61. QString generateResourceName(const QString &imagePath);
  62. };
  63. class ChatWindow : public QWidget
  64. {
  65. Q_OBJECT
  66. public:
  67. ChatWindow(WebSocketClient *webSocketClient, QWidget *parent = nullptr);
  68. void initWebsocket(const QString &roomId);
  69. protected:
  70. void closeEvent(QCloseEvent *event) override;
  71. signals:
  72. void windowCloseRequested();
  73. private slots:
  74. void onSendClicked();
  75. void onImageClicked();
  76. void onFileClicked();
  77. void onRecallClicked();
  78. void onInputContentChanged();
  79. void onImageInserted(const QString &imagePath);
  80. void onQuickButtonClicked();
  81. void onStreamNotification(bool show);
  82. void hideQuickButtons();
  83. void onStreamButtonClicked();
  84. private:
  85. ChatView *m_messageView;
  86. MultiFormatInputEdit *m_inputEdit;
  87. QPushButton *m_sendButton;
  88. QPushButton *m_imageButton;
  89. QPushButton *m_fileButton;
  90. QPushButton *m_streamButton;
  91. QButtonGroup *m_quickButtonGroup;
  92. QWidget *m_quickButtonContainer;
  93. QTimer *m_hideTimer;
  94. QString m_roomId;
  95. WebSocketClient *m_webSocketClient;
  96. void setupUI();
  97. void setupInputArea();
  98. void connectSignals();
  99. void sendMessage();
  100. void sendImageMessage(const QString &imagePath, const QString &text = QString());
  101. bool validateInput() const;
  102. void showQuickButtons();
  103. void setQuickButtonsVisible(bool visible);
  104. };
  105. #endif // CHATWINDOW_H