149 lines
5.4 KiB
C++
149 lines
5.4 KiB
C++
#include "detectresultpage.h"
|
||
#include "ui_detectresultpage.h"
|
||
|
||
#include <QDateTime>
|
||
#include <QHeaderView>
|
||
#include <QJsonArray>
|
||
#include <QJsonValue>
|
||
#include <QPixmap>
|
||
#include <QResizeEvent>
|
||
#include <QStringList>
|
||
#include <QTableWidgetItem>
|
||
|
||
namespace
|
||
{
|
||
QString statusText(int status)
|
||
{
|
||
switch (status) {
|
||
case 1: return QStringLiteral("新发现");
|
||
case 2: return QStringLiteral("增长中");
|
||
case 3: return QStringLiteral("已结束");
|
||
case 4: return QStringLiteral("无效");
|
||
default: return QStringLiteral("未知");
|
||
}
|
||
}
|
||
|
||
QString numberText(const QJsonObject& object, const QString& key)
|
||
{
|
||
return QString::number(object.value(key).toInt());
|
||
}
|
||
}
|
||
|
||
DetectResultPage::DetectResultPage(QWidget* parent)
|
||
: QWidget(parent),
|
||
ui(new Ui::DetectResultPage)
|
||
{
|
||
ui->setupUi(this);
|
||
// 居中拉伸各列,Designer 不支持直接设置该模式
|
||
ui->tearTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
|
||
// 与接收统计页的实时结果保持一致:明细 3 : 图片 5
|
||
ui->resultSplitter->setStretchFactor(0, 3);
|
||
ui->resultSplitter->setStretchFactor(1, 5);
|
||
}
|
||
|
||
DetectResultPage::~DetectResultPage()
|
||
{
|
||
delete ui;
|
||
}
|
||
|
||
void DetectResultPage::clearResults()
|
||
{
|
||
m_receivedCount = 0;
|
||
m_image = QImage();
|
||
|
||
ui->timeValueLabel->setText(QStringLiteral("-"));
|
||
ui->countValueLabel->setText(QStringLiteral("-"));
|
||
ui->alarmValueLabel->setText(QStringLiteral("-"));
|
||
ui->maxLengthValueLabel->setText(QStringLiteral("-"));
|
||
ui->maxWidthValueLabel->setText(QStringLiteral("-"));
|
||
ui->maxIdValueLabel->setText(QStringLiteral("-"));
|
||
ui->maxValueLabel->setText(QStringLiteral("-"));
|
||
ui->versionValueLabel->setText(QStringLiteral("-"));
|
||
ui->totalValueLabel->setText(QStringLiteral("-"));
|
||
ui->tearTable->setRowCount(0);
|
||
ui->imageLabel->setPixmap(QPixmap());
|
||
ui->imageLabel->setText(QStringLiteral("暂无图片"));
|
||
}
|
||
|
||
void DetectResultPage::handleDetectResult(const QJsonObject& result)
|
||
{
|
||
++m_receivedCount;
|
||
|
||
const QJsonArray tears = result.value(QStringLiteral("tears")).toArray();
|
||
const int count = result.value(QStringLiteral("count")).toInt(tears.size());
|
||
const qint64 timestamp = result.value(QStringLiteral("timestamp")).toVariant().toLongLong();
|
||
const QString timeText = timestamp > 0
|
||
? QDateTime::fromMSecsSinceEpoch(timestamp).toString(QStringLiteral("yyyy-MM-dd HH:mm:ss.zzz"))
|
||
: QStringLiteral("-");
|
||
|
||
ui->timeValueLabel->setText(timeText);
|
||
// count 应与 tears.length 一致,不一致时同时展示实际条数便于排查
|
||
ui->countValueLabel->setText(count == tears.size()
|
||
? QString::number(count)
|
||
: QStringLiteral("%1 (tears=%2)").arg(count).arg(tears.size()));
|
||
ui->alarmValueLabel->setText(result.value(QStringLiteral("alarm")).toBool()
|
||
? QStringLiteral("报警") : QStringLiteral("正常"));
|
||
ui->maxLengthValueLabel->setText(numberText(result, QStringLiteral("maxLength")));
|
||
ui->maxWidthValueLabel->setText(numberText(result, QStringLiteral("maxWidth")));
|
||
ui->maxIdValueLabel->setText(numberText(result, QStringLiteral("maxId")));
|
||
ui->maxValueLabel->setText(numberText(result, QStringLiteral("max")));
|
||
|
||
const QString version = result.value(QStringLiteral("protocolVersion")).toString();
|
||
ui->versionValueLabel->setText(version.isEmpty() ? QStringLiteral("-") : version);
|
||
ui->totalValueLabel->setText(QString::number(m_receivedCount));
|
||
|
||
ui->tearTable->setRowCount(tears.size());
|
||
for (int row = 0; row < tears.size(); ++row) {
|
||
const QJsonObject tear = tears.at(row).toObject();
|
||
const QStringList values = {
|
||
QString::number(tear.value(QStringLiteral("id")).toInt()),
|
||
statusText(tear.value(QStringLiteral("status")).toInt()),
|
||
QString::number(tear.value(QStringLiteral("length")).toDouble()),
|
||
QString::number(tear.value(QStringLiteral("width")).toDouble()),
|
||
QString::number(tear.value(QStringLiteral("depth")).toDouble())
|
||
};
|
||
for (int column = 0; column < values.size(); ++column) {
|
||
auto* item = new QTableWidgetItem(values.at(column));
|
||
item->setTextAlignment(Qt::AlignCenter);
|
||
ui->tearTable->setItem(row, column, item);
|
||
}
|
||
}
|
||
|
||
QByteArray encodedImage = result.value(QStringLiteral("visimg")).toString().toLatin1();
|
||
const int dataSeparator = encodedImage.indexOf(',');
|
||
if (encodedImage.startsWith("data:") && dataSeparator >= 0)
|
||
encodedImage.remove(0, dataSeparator + 1);
|
||
const QByteArray imageData = QByteArray::fromBase64(encodedImage);
|
||
QImage image;
|
||
if (!imageData.isEmpty() && image.loadFromData(imageData)) {
|
||
m_image = image;
|
||
updateImageDisplay();
|
||
} else if (encodedImage.isEmpty()) {
|
||
m_image = QImage();
|
||
ui->imageLabel->setPixmap(QPixmap());
|
||
ui->imageLabel->setText(QStringLiteral("暂无图片"));
|
||
} else {
|
||
emit parseError(QStringLiteral("DETECT_RESULT 结果图片解码失败"));
|
||
}
|
||
}
|
||
|
||
void DetectResultPage::resizeEvent(QResizeEvent* event)
|
||
{
|
||
QWidget::resizeEvent(event);
|
||
updateImageDisplay();
|
||
}
|
||
|
||
void DetectResultPage::updateImageDisplay()
|
||
{
|
||
if (m_image.isNull())
|
||
return;
|
||
|
||
const QSize targetSize = ui->imageLabel->contentsRect().size();
|
||
if (targetSize.isEmpty())
|
||
return;
|
||
|
||
ui->imageLabel->setText(QString());
|
||
ui->imageLabel->setPixmap(QPixmap::fromImage(m_image).scaled(
|
||
targetSize, Qt::KeepAspectRatio, Qt::SmoothTransformation));
|
||
}
|