#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(); static QWidget* makeFileMessageItem(); static QWidget* makeSpeechMessageItem(); private: bool isLeft; }; //////////////////////////////////////////// /// 创建类表示“文本消息”正文部分 //////////////////////////////////////////// class MessageContentLabel : public QWidget { public: MessageContentLabel(const QString& text, bool isLeft); void paintEvent(QPaintEvent* event) override; private: QLabel* label; bool isLeft; }; #endif // MESSAGESHOWAREA_H