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,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);
}