mirror of
https://gitee.com/Zhaoxin59/my-chat_-client.git
synced 2026-02-14 09:01:50 +08:00
has been completed.
This commit is contained in:
@ -1,5 +1,10 @@
|
||||
#include "historymessagewidget.h"
|
||||
|
||||
#include "model/datacenter.h"
|
||||
#include "toast.h"
|
||||
#include "soundrecorder.h"
|
||||
|
||||
using namespace model;
|
||||
|
||||
//工厂函数
|
||||
HistoryItem* HistoryItem::makeHistoryItem(const Message& message)
|
||||
@ -43,15 +48,15 @@ HistoryItem* HistoryItem::makeHistoryItem(const Message& message)
|
||||
}
|
||||
else if (message.messageType == model::MessageType::IMAGE_TYPE) {
|
||||
// 图片消息
|
||||
//contentWidget = new ImageButton(message.fileId, message.content);
|
||||
contentWidget = new ImageButton(message.fileId, message.content);
|
||||
}
|
||||
else if (message.messageType == model::MessageType::FILE_TYPE) {
|
||||
// 文件消息
|
||||
//contentWidget = new FileLabel(message.fileId, message.fileName);
|
||||
contentWidget = new FileLabel(message.fileId, message.fileName);
|
||||
}
|
||||
else if (message.messageType == model::MessageType::SPEECH_TYPE) {
|
||||
// 语音消息
|
||||
//contentWidget = new SpeechLabel(message.fileId);
|
||||
contentWidget = new SpeechLabel(message.fileId);
|
||||
}
|
||||
else {
|
||||
LOG() << "错误的消息类型! messageType=" << message.messageType;
|
||||
@ -168,7 +173,7 @@ HistoryMessageWidget::HistoryMessageWidget(QWidget *parent)
|
||||
endTimeEdit->show();
|
||||
});
|
||||
|
||||
//connect(searchBtn, &QPushButton::clicked, this, &HistoryMessageWidget::clickSearchBtn);
|
||||
connect(searchBtn, &QPushButton::clicked, this, &HistoryMessageWidget::clickSearchBtn);
|
||||
|
||||
// 构造测试数据
|
||||
#if TEST_UI
|
||||
@ -211,6 +216,48 @@ void HistoryMessageWidget::clear()
|
||||
}
|
||||
}
|
||||
|
||||
void HistoryMessageWidget::clickSearchBtn()
|
||||
{
|
||||
DataCenter* dataCenter = DataCenter::getInstance();
|
||||
connect(dataCenter, &DataCenter::searchMessageDone, this, &HistoryMessageWidget::clickSearchBtnDone, Qt::UniqueConnection);
|
||||
|
||||
//此处需要根据单选框的选中情况,执行不同逻辑
|
||||
if (keyRadioBtn->isChecked()) {
|
||||
//按照关键词搜索
|
||||
const QString& searchKey = searchEdit->text();
|
||||
if (searchKey.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
dataCenter->searchMessageAsync(searchKey);
|
||||
}
|
||||
else {
|
||||
//安时间搜索
|
||||
auto begTime = begTimeEdit->dateTime();
|
||||
auto endTime = endTimeEdit->dateTime();
|
||||
if (begTime >= endTime) {
|
||||
Toast::showMessage("时间设置有误");
|
||||
return;
|
||||
}
|
||||
dataCenter->searchMessageByTimeAsync(begTime, endTime);
|
||||
}
|
||||
}
|
||||
|
||||
void HistoryMessageWidget::clickSearchBtnDone()
|
||||
{
|
||||
//从DataCenter中拿到消息搜索结果列表
|
||||
DataCenter* dataCenter = DataCenter::getInstance();
|
||||
QList<Message>* messageResult = dataCenter->getSearchMessageReuslt();
|
||||
if (messageResult == nullptr) {
|
||||
return;
|
||||
}
|
||||
|
||||
//把结果列表的数据,显示到界面上
|
||||
this->clear();
|
||||
for (const Message& m : *messageResult) {
|
||||
this->addHistoryMessage(m);
|
||||
}
|
||||
}
|
||||
|
||||
void HistoryMessageWidget::initScrollArea(QGridLayout* layout)
|
||||
{
|
||||
// 1. 创建滚动区域对象
|
||||
@ -236,3 +283,134 @@ void HistoryMessageWidget::initScrollArea(QGridLayout* layout)
|
||||
layout->addWidget(scrollArea, 2, 0, 1, 9);
|
||||
|
||||
}
|
||||
|
||||
ImageButton::ImageButton(const QString& fileId, const QByteArray& content)
|
||||
:fileId(fileId)
|
||||
{
|
||||
this->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
|
||||
this->setStyleSheet("QPushButton { border: none; }");
|
||||
|
||||
if (!content.isEmpty()) {
|
||||
// 直接显示到界面上
|
||||
this->updateUI(fileId, content);
|
||||
}
|
||||
else {
|
||||
// 通过网络来获取
|
||||
DataCenter* dataCenter = DataCenter::getInstance();
|
||||
connect(dataCenter, &DataCenter::getSingleFileDone, this, &ImageButton::updateUI);
|
||||
dataCenter->getSingleFileAsync(fileId);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void ImageButton::updateUI(const QString& fileId, const QByteArray& content)
|
||||
{
|
||||
if (this->fileId != fileId) {
|
||||
return;
|
||||
}
|
||||
// 如果图片尺寸太大, 需要进行缩放.
|
||||
QImage image;
|
||||
image.loadFromData(content);
|
||||
|
||||
int width = image.width();
|
||||
int height = image.height();
|
||||
if (image.width() >= 300) {
|
||||
// 进行缩放, 缩放之后, 宽度就是固定的 300
|
||||
width = 300;
|
||||
height = ((double)image.height() / image.width()) * width;
|
||||
}
|
||||
this->resize(width, height);
|
||||
this->setIconSize(QSize(width, height));
|
||||
QPixmap pixmap = QPixmap::fromImage(image);
|
||||
this->setIcon(QIcon(pixmap));
|
||||
|
||||
}
|
||||
|
||||
FileLabel::FileLabel(const QString& fileId, const QString& fileName)
|
||||
:fileId(fileId), filename(fileName)
|
||||
{
|
||||
this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
|
||||
this->setText("[文件] " + fileName);
|
||||
this->setWordWrap(true);
|
||||
// 自动调整尺寸让能够显示下文字内容
|
||||
this->adjustSize();
|
||||
this->setAlignment(Qt::AlignTop | Qt::AlignLeft);
|
||||
|
||||
// if (!content.isEmpty()) {
|
||||
// // 原则上来说, 这个条件不会触发. 因为这里的 content 是来自于请求服务器的 历史消息列表的 接口.
|
||||
// // 请求这个接口的过程中, 拿到的 Message 对象(不是文本), content 必然为 空, 通过 fileId 做二次请求.
|
||||
// return;
|
||||
// }
|
||||
|
||||
// 需要从网络加载数据了
|
||||
DataCenter* dataCenter = DataCenter::getInstance();
|
||||
connect(dataCenter, &DataCenter::getSingleFileDone, this, &FileLabel::getContentDone);
|
||||
dataCenter->getSingleFileAsync(this->fileId);
|
||||
|
||||
}
|
||||
|
||||
void FileLabel::getContentDone(const QString& fileId, const QByteArray& fileContent)
|
||||
{
|
||||
if (fileId != this->fileId) {
|
||||
return;
|
||||
}
|
||||
|
||||
this->content = fileContent;
|
||||
this->loadDone = true;
|
||||
}
|
||||
|
||||
void FileLabel::mousePressEvent(QMouseEvent* event)
|
||||
{
|
||||
(void)event;
|
||||
if (!this->loadDone) {
|
||||
// 说明数据还没准备好.
|
||||
Toast::showMessage("文件内容加载中, 请稍后尝试!");
|
||||
return;
|
||||
}
|
||||
|
||||
// 弹出一个对话框, 让用户来选择当前要保存的位置
|
||||
QString filePath = QFileDialog::getSaveFileName(this, "另存为", QDir::homePath(), "*");
|
||||
if (filePath.isEmpty()) {
|
||||
// 用户取消了保存
|
||||
LOG() << "用户取消了保存";
|
||||
return;
|
||||
}
|
||||
|
||||
writeByteArrayToFile(filePath, content);
|
||||
}
|
||||
|
||||
SpeechLabel::SpeechLabel(const QString& fileId)
|
||||
:fileId(fileId)
|
||||
{
|
||||
this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
|
||||
this->setText("[语音]");
|
||||
this->setAlignment(Qt::AlignLeft | Qt::AlignTop);
|
||||
// 这两个操作不太需要了. 此处只有 语音 两个字
|
||||
this->setWordWrap(true);
|
||||
this->adjustSize();
|
||||
|
||||
DataCenter* dataCenter = DataCenter::getInstance();
|
||||
connect(dataCenter, &DataCenter::getSingleFileDone, this, &SpeechLabel::getContentDone);
|
||||
dataCenter->getSingleFileAsync(fileId);
|
||||
|
||||
}
|
||||
|
||||
void SpeechLabel::getContentDone(const QString& fileId, const QByteArray& content)
|
||||
{
|
||||
if (fileId != this->fileId) {
|
||||
return;
|
||||
}
|
||||
this->content = content;
|
||||
this->loadDone = true;
|
||||
}
|
||||
|
||||
void SpeechLabel::mousePressEvent(QMouseEvent* event)
|
||||
{
|
||||
(void)event;
|
||||
if (!this->loadDone) {
|
||||
Toast::showMessage("文件内容加载中, 稍后重试");
|
||||
return;
|
||||
}
|
||||
SoundRecorder* soundRecorder = SoundRecorder::getInstance();
|
||||
soundRecorder->startPlay(this->content);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user