chatwindow.h 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  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 "network/websocketclient.h"
  21. class ChatView;
  22. // 多格式输入框类
  23. class MultiFormatInputEdit : public QTextEdit
  24. {
  25. Q_OBJECT
  26. public:
  27. explicit MultiFormatInputEdit(QWidget *parent = nullptr);
  28. // 获取纯文本内容
  29. QString getPlainText() const;
  30. // 获取所有图片路径
  31. QStringList getImagePaths() const;
  32. // 添加图片到输入框
  33. void insertImage(const QString &imagePath);
  34. // 清空内容
  35. void clearContent();
  36. // 验证输入内容
  37. bool validateContent() const;
  38. // 移除指定图片
  39. void removeImage(const QString &imagePath);
  40. signals:
  41. void contentChanged();
  42. void imageInserted(const QString &imagePath);
  43. void imageRemoved(const QString &imagePath);
  44. void sendRequested();
  45. protected:
  46. void dragEnterEvent(QDragEnterEvent *event) override;
  47. void dropEvent(QDropEvent *event) override;
  48. void keyPressEvent(QKeyEvent *event) override;
  49. void insertFromMimeData(const QMimeData *source) override;
  50. void contextMenuEvent(QContextMenuEvent *event) override;
  51. private slots:
  52. void onTextChanged();
  53. private:
  54. QStringList m_imagePaths;
  55. QMap<QString, QString> m_imageResourceMap; // 图片路径到资源名称的映射
  56. void processImageData(const QByteArray &imageData, const QString &format = "PNG");
  57. bool isImageFormat(const QString &fileName) const;
  58. QString saveImageToTemp(const QPixmap &pixmap, const QString &format = "PNG");
  59. void insertImageIntoDocument(const QString &imagePath);
  60. QString generateResourceName(const QString &imagePath);
  61. };
  62. class ChatWindow : public QWidget
  63. {
  64. Q_OBJECT
  65. public:
  66. ChatWindow(WebSocketClient *webSocketClient, QWidget *parent = nullptr);
  67. void initWebsocket(const QString &roomId);
  68. protected:
  69. void closeEvent(QCloseEvent *event) override;
  70. signals:
  71. void windowCloseRequested();
  72. private slots:
  73. void onSendClicked();
  74. void onImageClicked();
  75. void onFileClicked();
  76. void onRecallClicked();
  77. void onInputContentChanged();
  78. void onImageInserted(const QString &imagePath);
  79. private:
  80. ChatView *m_messageView;
  81. MultiFormatInputEdit *m_inputEdit;
  82. QPushButton *m_sendButton;
  83. QPushButton *m_imageButton;
  84. QPushButton *m_fileButton;
  85. QString m_roomId;
  86. WebSocketClient *m_webSocketClient;
  87. void setupUI();
  88. void setupInputArea();
  89. void connectSignals();
  90. void sendMessage();
  91. void sendImageMessage(const QString &imagePath, const QString &text = QString());
  92. bool validateInput() const;
  93. };
  94. #endif // CHATWINDOW_H