has been completed.

This commit is contained in:
xyz
2025-09-09 15:37:57 +08:00
parent 83f3f4f74e
commit 89ff4fbac0
38 changed files with 2679 additions and 161 deletions

View File

@ -1,7 +1,7 @@
#include "messageeditarea.h"
#include "mainwidget.h"
#include "soundrecorder.h"
#include "model/datacenter.h"
#include "toast.h"
using namespace model;
@ -182,6 +182,15 @@ MessageEditArea::MessageEditArea(QWidget *parent)
vlayout->addWidget(sendTextButton, 0, Qt::AlignRight | Qt::AlignVCenter);
//添加录制中
tipLabel = new QLabel();
tipLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
tipLabel->setText("录音中...");
tipLabel->setAlignment(Qt::AlignCenter);
tipLabel->setFont(QFont("微软雅黑", 24, 600));
vlayout->addWidget(tipLabel);
tipLabel->hide();
//统一初始化信号槽
initSignalSlot();
}
@ -192,6 +201,9 @@ void MessageEditArea::initSignalSlot()
//关联“显示历史消息窗口”信号槽
connect(showHistoryBtn, &QPushButton::clicked, this, [=]() {
if (dataCenter->getCurrentSessionId().isEmpty()) {
return;
}
HistoryMessageWidget* historyMessageWidget = new HistoryMessageWidget(this);
historyMessageWidget->exec();
});
@ -202,6 +214,18 @@ void MessageEditArea::initSignalSlot()
//关联收到消息的信号槽
connect(dataCenter, &DataCenter::receiveMessageDone, this, &MessageEditArea::addOtherMessage);
//关联发送图片
connect(sendImageBtn, &QPushButton::clicked, this, &MessageEditArea::clickSendImageBtn);
//关联发送文件
connect(sendFileBtn, &QPushButton::clicked, this, &MessageEditArea::clickSendFileBtn);
//关联发送语音
connect(sendSpeechBtn, &QPushButton::pressed, this, &MessageEditArea::soundRecordPressed);
connect(sendSpeechBtn, &QPushButton::released, this, &MessageEditArea::soundRecordReleased);
SoundRecorder* soundRecorder = SoundRecorder::getInstance();
connect(soundRecorder, &SoundRecorder::soundRecordDone, this, &MessageEditArea::soundSpeech);
}
void MessageEditArea::sendTextMessage()
@ -267,6 +291,112 @@ void MessageEditArea::addOtherMessage(const model::Message& message)
Toast::showMessage("收到新消息!");
}
void MessageEditArea::clickSendImageBtn()
{
DataCenter* dataCenter = DataCenter::getInstance();
//判定当前是否有选中的会话
if (dataCenter->getCurrentSessionId().isEmpty()) {
//没有选中会话
LOG() << "当前尚未选中任何会话";
return;
}
//弹出文件对话框
QString filter = "Image Files (*.png *.jpg *.jpeg *.mp4)";
QString imagePath = QFileDialog::getOpenFileName(this, "选择图片", QDir::homePath(), filter);
if (imagePath.isEmpty()) {
LOG() << "用户取消选择";
return;
}
//读取图片内容
QByteArray imageContent = loadFileToByteArray(imagePath);
//发送请求
dataCenter->sendImageMessageAsync(dataCenter->getCurrentSessionId(), imageContent);
}
void MessageEditArea::clickSendFileBtn()
{
DataCenter* dataCenter = DataCenter::getInstance();
//判定当前是否有选中的会话
if (dataCenter->getCurrentSessionId().isEmpty()) {
//没有选中会话
LOG() << "当前尚未选中任何会话";
return;
}
//弹出对话框,选择文件
QString filter = "*";
QString path = QFileDialog::getOpenFileName(this, "选择文件", QDir::homePath(), filter);
if (path.isEmpty()) {
LOG() << "用户取消选择";
return;
}
//读取文件内容(暂时没有考虑非常大的文件)
//如果针对大文件,编写专门的网络通信接口,实现分片传输效果
QByteArray content = loadFileToByteArray(path);
//传输文件,还需要获取到文件名
QFileInfo fileInfo(path);
const QString& filename = fileInfo.fileName();
//发送消息
dataCenter->sendFileMessageAsync(dataCenter->getCurrentSessionId(), filename, content);
}
void MessageEditArea::soundRecordPressed()
{
DataCenter* dataCenter = DataCenter::getInstance();
//判定当前是否有选中的会话
if (dataCenter->getCurrentSessionId().isEmpty()) {
//没有选中会话
LOG() << "当前尚未选中任何会话";
return;
}
//切换语音按钮的图标
sendSpeechBtn->setIcon(QIcon(":/resource/image/sound_active.png"));
//开始录音
SoundRecorder* soundRecorder = SoundRecorder::getInstance();
soundRecorder->startRecord();
tipLabel->show();
textEdit->hide();
}
void MessageEditArea::soundRecordReleased()
{
DataCenter* dataCenter = DataCenter::getInstance();
//判定当前是否有选中的会话
if (dataCenter->getCurrentSessionId().isEmpty()) {
//没有选中会话
LOG() << "当前尚未选中任何会话";
return;
}
//切换语音按钮的图标
sendSpeechBtn->setIcon(QIcon(":/resource/image/sound.png"));
//开始录音
SoundRecorder* soundRecorder = SoundRecorder::getInstance();
tipLabel->hide();
textEdit->show();
soundRecorder->stopRecord();
}
void MessageEditArea::soundSpeech(const QString& path)
{
DataCenter* dataCenter = DataCenter::getInstance();
QByteArray content = loadFileToByteArray(path);
if (content.isEmpty()) {
LOG() << "语音文件加载失败";
return;
}
dataCenter->sendSpeechMessageAsync(dataCenter->getCurrentSessionId(), content);
}
//bool MessageEditArea::eventFilter(QObject* obj, QEvent* event)
//{