Newer
Older
PhaseMeasure / PhaseWindow.cpp
TAN YUE on 28 Dec 2021 5 KB 20211228 实时更新测量数据
#include "PhaseWindow.h"
#include "ui_PhaseWindow.h"

#include <iostream>
#include <QTimer>
#include <QDateTime>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QHBoxLayout>
#include <QDesktopWidget>
#include <QThread>
#include <SetConfig.h>
#include <QPixmap>
#include "common/utils/SettingConfig.h"
#include "common/utils/QLogUtil.h"

PhaseWindow::PhaseWindow(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::PhaseWindow)
{
    ui->setupUi(this);

    // 无边框
    this->setWindowFlags(Qt::FramelessWindowHint);

    // 窗口大小为占满一屏
    QRect screenRect = QApplication::desktop()->screenGeometry();
    resize(screenRect.width(), screenRect.height());

    // 将窗口移动到左上角
    move(0, 0);
    ui->exitButt->move(screenRect.width() - 80, 10);
    ui->minButt->move(screenRect.width() - 140, 10);
    ui->settingButt->move(screenRect.width() - 200, 10);
    ui->endButt->move(screenRect.width() - 260, 10);
    ui->startButt->move(screenRect.width() - 320, 10);
    ui->line->setGeometry(0, 89, screenRect.width(), 1);
    ui->pointsList->setGeometry(250,30,screenRect.width()-600,40);
    ui->labelsList->setGeometry(250,60,screenRect.width()-600,30);

    // 设置主体区域的大小和位置
    ui->scrollArea->setGeometry(0, 90, screenRect.width(), screenRect.height() - 90);
    ui->scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);

    ui->tim3->setText(QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss.zzz"));

    this->generateWidgetForDevice();

    device = new PhaseDevice(this);
    connect(device, &PhaseDevice::sendDataToDraw,
            this, &PhaseWindow::drawPhaseDataOnPage);
}

PhaseWindow::~PhaseWindow()
{
    delete ui;
}

void PhaseWindow::drawPhaseDataOnPage(PhaseDataDto * phaseData)
{
    ui->tim3->setText(phaseData->timestamp);
    updateChannelActive(phaseData->channelActive);

    // 更新所有通道BOX的值
    for (int i = 0; i < phaseData->channelActive.size(); i++)
    {
        // 获取对应的通道BOX
        if (phaseData->channelActive.at(i) == "1")
        {
            ChannelItem * channel = channelItemList.at(i);
            double phaseValue = channel->updatePhaseMeasureData(phaseData->channelData.at(i));

            QString chFilename = QString("CH_%1.log").arg(i + 1, 2, 10, QLatin1Char('0'));
            QString channelDataStr = QString("%1 [%2] %3 %4 %5")
                    .arg(phaseData->timestamp)
                    .arg(phaseData->frameId)
                    .arg(phaseData->channelDataStr.at(i))
                    .arg(QString::number(channel->getChannelDelay()))
                    .arg(QString::number(phaseValue, 'f', 15));
            std::cout << channelDataStr.toStdString() << std::endl;

            QLogUtil::writeChannelDataLogByDate(phaseData->timestamp.mid(0, 10), chFilename, channelDataStr);
        }
    }
}

void PhaseWindow::generateWidgetForDevice()
{
    // 获取设备数据
    int channelNum = SettingConfig::getInstance().CHANNEL_COUNT;

    QRect screenRect = QApplication::desktop()->screenGeometry();

    ui->scrollContents->setGeometry(0, 90, screenRect.width(), channelNum * 170);

    QVBoxLayout * layout = new QVBoxLayout(ui->scrollContents);
    const QFont labelFont("微软雅黑", 10);

    for (int i = 0; i < channelNum; i++)
    {
        // 通道状态图标默认显示为离线/无效状态
        QLabel* label = ui->pointsList->findChild<QLabel*>(QString("p%1").arg(i+1)); //根据子控件的名称查找子控件
        label->setPixmap(QPixmap(":/points/images/white.png"));

        QGroupBox * group = new QGroupBox(ui->scrollContents);
        group->setTitle(QString("通道 - %1").arg(i + 1));
        group->setFont(QFont("微软雅黑", 12));
        group->setGeometry(20, i * 160 + 10, screenRect.width() - 40, 160);
        this->channelGroupList.append(group);

        QHBoxLayout * vbox = new QHBoxLayout(group);
        ChannelItem * channelItem = new ChannelItem();
        channelItem->setGeometry(10, 0, screenRect.width() - 60, 160);
        this->channelItemList.append(channelItem);

        vbox->addWidget(channelItem);
        group->setLayout(vbox);
        layout->addWidget(group);
    }
}

void PhaseWindow::updateChannelActive(QList<QString> channelActive)
{
    for (int i = 0; i < channelActive.size(); i++)
    {
        if (channelActive.at(i) == "1")
        {
            QLabel* label = ui->pointsList->findChild<QLabel*>(QString("p%1").arg(i+1)); //根据子控件的名称查找子控件
            label->setPixmap(QPixmap(":/points/images/green.png"));

            // 显示有效的通道
            this->channelGroupList.at(i)->show();
        } else
        {
            QLabel* label = ui->pointsList->findChild<QLabel*>(QString("p%1").arg(i+1)); //根据子控件的名称查找子控件
            label->setPixmap(QPixmap(":/points/images/white.png"));

            // 隐藏无效的通道
            this->channelGroupList.at(i)->hide();
        }
    }
}


void PhaseWindow::on_minButt_clicked()
{
    setWindowState(Qt::WindowMinimized | windowState());
}

void PhaseWindow::on_exitButt_clicked()
{
    QApplication::exit(0);
}

void PhaseWindow::on_startButt_clicked()
{
    //发送开始指令
    device->startWork();
}

void PhaseWindow::on_endButt_clicked()
{
    //发送结束指令
    device->stopWork();
}

void PhaseWindow::on_settingButt_clicked()
{
    SetConfig *new_win = new SetConfig();
    new_win->setWindowTitle("配置");
    new_win->show();
}