160 lines
5.6 KiB
C++

#include "resultitem.h"
#include "ui_resultitem.h"
#include <QStringList>
#include <QFrame>
namespace
{
void setResultTextStyle(Ui::ResultItem* ui)
{
const QString titleStyle =
QStringLiteral("color: rgb(239, 241, 245); background-color: rgb(37, 38, 42); font-size: 16px; font-weight: 600;");
const QString valueStyle =
QStringLiteral("color: rgb(255, 255, 255); background-color: rgb(37, 38, 42); font-size: 20px; font-weight: 700;");
if (ui->lb_id_t) ui->lb_id_t->setStyleSheet(titleStyle);
if (ui->lb_time_t) ui->lb_time_t->setStyleSheet(titleStyle);
if (ui->lb_count_t) ui->lb_count_t->setStyleSheet(titleStyle);
if (ui->lb_size_t) ui->lb_size_t->setStyleSheet(titleStyle);
if (ui->lb_status_t) ui->lb_status_t->setStyleSheet(titleStyle);
if (ui->label_id) ui->label_id->setStyleSheet(valueStyle);
if (ui->label_time) ui->label_time->setStyleSheet(valueStyle);
if (ui->label_count) ui->label_count->setStyleSheet(valueStyle);
if (ui->label_size) ui->label_size->setStyleSheet(valueStyle);
if (ui->label_status) ui->label_status->setStyleSheet(valueStyle);
}
QString failedText(const CtrlDetectionFrame& frame)
{
return frame.message.isEmpty() ? QStringLiteral("检测失败") : frame.message;
}
QString oneDistanceText(const CtrlDetectionDistance& d)
{
const double meters = d.distanceMm / 1000.0;
if (d.fromId < 0)
return QStringLiteral("整体距离: %1m").arg(meters, 0, 'f', 3);
return QStringLiteral("目标%1距离: %2m").arg(d.fromId + 1).arg(meters, 0, 'f', 3);
}
QString distanceText(const CtrlDetectionFrame& frame, int targetIndex)
{
if (targetIndex >= 0 && targetIndex < static_cast<int>(frame.distances.size()))
return oneDistanceText(frame.distances[static_cast<size_t>(targetIndex)]);
QStringList distanceParts;
for (size_t i = 0; i < frame.distances.size(); ++i)
distanceParts << oneDistanceText(frame.distances[i]);
return distanceParts.isEmpty()
? QStringLiteral("未测到距离")
: distanceParts.join(" ");
}
QString distanceIndexText(const CtrlDetectionFrame& frame, int targetIndex)
{
const int total = static_cast<int>(frame.distances.size());
if (targetIndex >= 0 && targetIndex < total)
{
const CtrlDetectionDistance& d = frame.distances[static_cast<size_t>(targetIndex)];
return QString::number(d.toId);
}
return QStringLiteral("-");
}
}
ResultItem::ResultItem(QWidget* parent)
: QWidget(parent)
, ui(new Ui::ResultItem)
{
ui->setupUi(this);
setAttribute(Qt::WA_StyledBackground, true);
setAutoFillBackground(true);
setStyleSheet(QStringLiteral(
"QWidget#ResultItem { background-color: rgb(37, 38, 42); border: 6px solid #191A1C; border-radius: 0px; }"
"QFrame#frame { background-color: rgb(37, 38, 42); border: none; }"
"QLabel { background-color: rgb(37, 38, 42); color: rgb(255, 255, 255); }"));
if (ui->frame)
ui->frame->setFrameShape(QFrame::NoFrame);
if (ui->lb_time_t) ui->lb_time_t->hide();
if (ui->label_time) ui->label_time->hide();
if (ui->lb_count_t) ui->lb_count_t->hide();
if (ui->label_count) ui->label_count->hide();
if (ui->lb_size_t) ui->lb_size_t->hide();
if (ui->label_size) ui->label_size->hide();
if (ui->grid && ui->lb_status_t && ui->label_status)
{
ui->grid->removeWidget(ui->lb_status_t);
ui->grid->removeWidget(ui->label_status);
ui->grid->addWidget(ui->lb_status_t, 1, 0);
ui->grid->addWidget(ui->label_status, 1, 1);
ui->grid->setColumnStretch(0, 0);
ui->grid->setColumnStretch(1, 1);
ui->grid->setColumnMinimumWidth(0, 52);
}
if (ui->label_id)
ui->label_id->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
if (ui->label_status)
{
ui->label_status->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
ui->label_status->setWordWrap(true);
}
}
ResultItem::~ResultItem()
{
delete ui;
}
void ResultItem::setResultData(int targetIndex,
const CtrlDetectionFrame& frame,
DisplayMode mode)
{
const bool precisionMode = (mode == DisplayMode::Precision);
setResultTextStyle(ui);
setMinimumHeight(precisionMode ? 92 : 82);
if (ui->label_id)
{
if (precisionMode && targetIndex >= 0)
ui->label_id->setText(QString("%1/%2")
.arg(targetIndex + 1)
.arg(static_cast<int>(frame.boxes.size())));
else if (mode == DisplayMode::Distance)
{
ui->label_id->setText(distanceIndexText(frame, targetIndex));
}
else
ui->label_id->setText(QStringLiteral("0/0"));
}
if (mode == DisplayMode::Distance)
{
if (ui->label_status)
ui->label_status->setText(frame.success ? distanceText(frame, targetIndex) : failedText(frame));
return;
}
if (ui->label_status)
{
if (targetIndex >= 0 && targetIndex < static_cast<int>(frame.boxes.size()))
{
const CtrlDetectionBox& b = frame.boxes[static_cast<size_t>(targetIndex)];
const QString text = QStringLiteral("score=%1 w=%2 h=%3")
.arg(b.score, 0, 'f', 3)
.arg(b.width)
.arg(b.height);
ui->label_status->setText(text);
}
else if (!frame.success)
{
ui->label_status->setText(failedText(frame));
}
else
{
ui->label_status->setText(QStringLiteral("未检测到目标"));
}
}
}