refactor: 大规模调整项目目录结构,将ChatClient和ChatServer整合为Monorepo结构,并分为两个独立文件夹:chatclient/ 和 chatserver/。更新了ChatClient的CMakeLists.txt配置以适配新结构。

This commit is contained in:
xyz
2025-09-16 19:47:22 +08:00
parent 89ff4fbac0
commit e7af9ad1d7
77 changed files with 146 additions and 168 deletions

View 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