#ifndef MESSAGESHOWAREA_H #define MESSAGESHOWAREA_H #include #include #include #include #include #include #include #include #include #include "model/data.h" #include "debug.h" //.h文件中,不宜使用namespace xxx using model::Message; //////////////////////////////////////////// /// 表示消息展示区 //////////////////////////////////////////// class MessageShowArea : public QScrollArea { Q_OBJECT public: MessageShowArea(); //头插 void addFrontMessage(bool isLeft, const Message& message); //尾插 void addMessage(bool isLeft, const Message& message); //清空 void clear(); //滚动到末尾 void scrollToEnd(); private: QWidget* container; }; //////////////////////////////////////////// /// 表示一个消息元素 /// 我们可能考虑要同时支持文本,文件,图片,视频,语音 //////////////////////////////////////////// class MessageItem : public QWidget { public: //isLeft表示当前的这个消息是否是左侧的消息 MessageItem(bool isLeft); //通过工厂方法创建MessageItem实例 static MessageItem* makeMessageItem(bool isLeft, const Message& message); //添加工厂函数 static QWidget* makeTextMessageItem(bool isLeft, const QString& message); static QWidget* makeImageMessageItem(bool isLeft, const QString& fileId, const QByteArray& content); static QWidget* makeFileMessageItem(bool isLeft, const Message& message); static QWidget* makeSpeechMessageItem(bool isLeft, const Message& message); private: bool isLeft; }; //////////////////////////////////////////// /// 创建类表示“文本消息”正文部分 //也让这个类表示文件消息 //////////////////////////////////////////// class MessageContentLabel : public QWidget { public: MessageContentLabel(const QString& text, bool isLeft, model::MessageType messageType, const QString& fileId, const QByteArray& content); void paintEvent(QPaintEvent* event) override; void mousePressEvent(QMouseEvent* event) override; void updateUI(const QString& fileId, const QByteArray& fileContent); void saveAsFile(const QByteArray& content); void playDone(); void contextMenuEvent(QContextMenuEvent* event) override; void speechConverTextDone(const QString& fileId, const QString& text); private: QLabel* label; bool isLeft; model::MessageType messageType; QString fileId; QByteArray content; QString fileName; bool loadContentDone = false; }; //////////////////////////////////////////// /// 创建类表示“图片消息”部分 //////////////////////////////////////////// class MessageImageLabel : public QWidget { Q_OBJECT public: MessageImageLabel(const QString& fileId, const QByteArray& content, bool isLeft); void updateUI(const QString& fileId, const QByteArray& content); void paintEvent(QPaintEvent* event) override; private: QPushButton* imageBtn; QString fileId; //该图片在服务器对应的文件id QByteArray content; //图片的二进制数据 bool isLeft; }; #endif // MESSAGESHOWAREA_H