#include "detectresultpage.h" #include "ui_detectresultpage.h" #include #include #include #include #include #include #include #include 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)); }