mirror of
https://gitee.com/Zhaoxin59/my-chat_-client.git
synced 2026-02-14 00:51:48 +08:00
has been completed.
This commit is contained in:
@ -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)
|
||||
//{
|
||||
|
||||
Reference in New Issue
Block a user