mirror of
https://gitee.com/Zhaoxin59/my-chat_-client.git
synced 2026-02-14 09:01:50 +08:00
refactor: 大规模调整项目目录结构,将ChatClient和ChatServer整合为Monorepo结构,并分为两个独立文件夹:chatclient/ 和 chatserver/。更新了ChatClient的CMakeLists.txt配置以适配新结构。
This commit is contained in:
120
ChatClient/include/messageshowarea.h
Normal file
120
ChatClient/include/messageshowarea.h
Normal file
@ -0,0 +1,120 @@
|
||||
#ifndef MESSAGESHOWAREA_H
|
||||
#define MESSAGESHOWAREA_H
|
||||
|
||||
#include <QScrollArea>
|
||||
#include <QWidget>
|
||||
#include <QVBoxLayout>
|
||||
#include <QScrollBar>
|
||||
#include <QPushButton>
|
||||
#include <QLabel>
|
||||
#include <QFontMetrics>
|
||||
#include <QPainter>
|
||||
#include <QPainterPath>
|
||||
|
||||
|
||||
#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
|
||||
Reference in New Issue
Block a user