Newer
Older
ZXSSCJ / CounterAcq / CounterWindow.cpp
TAN YUE on 23 Feb 2022 7 KB 20220223 离线钟差采集
#include "CounterWindow.h"
#include "ui_CounterWindow.h"

#include <iostream>
#include <QTimer>
#include <QDateTime>
#include <QLabel>
#include <QGroupBox>
#include <QLineEdit>
#include <QPushButton>
#include <QHBoxLayout>
#include <QDesktopWidget>
#include <QThread>

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

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

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

    // 将窗口移动到左上角
    move(0, 0);
    ui->exitButt->move(screenRect.width() - 80, 10);
    ui->minButt->move(screenRect.width() - 140, 10);
    ui->line->setGeometry(0, 59, screenRect.width(), 1);

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

    ui->devSelect->clear();
    for (int i = 0; i < SettingConfig::getInstance().DEV_CODE.size(); i++)
    {
        ui->devSelect->addItem(SettingConfig::getInstance().DEV_NAME.at(i), SettingConfig::getInstance().DEV_CODE.at(i));

        CounterDevice * device = new CounterDevice(this);
        deviceList.append(device);

        device->setComName(SettingConfig::getInstance().COM_NAME.at(i));
        device->setBaudRate(SettingConfig::getInstance().BAUD_RATE);
        device->setDevCode(SettingConfig::getInstance().DEV_CODE.at(i));
        device->setDeviceId(SettingConfig::getInstance().DEVICE_ID.at(i));

        connect(device, &CounterDevice::sendDataToDraw,
                this, &CounterWindow::drawCounterDataOnPage);

        device->initSerialPort();

        QThread::msleep(200);
    }

    // 5. 设置下拉框的样式
    QStandardItemModel * model = qobject_cast<QStandardItemModel*>(ui->devSelect->model());
    for (int i = 0; i < model->rowCount(); ++i)
    {
        QStandardItem * item = model->item(i);
        item->setSizeHint({ 0, 30 });
    }

    // 6. 绘制一个设备的多个通道数据面板
    this->generateWidgetForDevice();
}

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

void CounterWindow::generateWidgetForDevice()
{
    // 获取设备数据
    int channelNum = 16;

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

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

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

    for (int i = 0; i < channelNum; i++)
    {
        QGroupBox * group = new QGroupBox(ui->scrollContents);
        group->setTitle(QString("通道 - %1").arg(i + 1));
        group->setFont(QFont("微软雅黑", 12));
        group->setGeometry(20, i * 80 + 10, screenRect.width() - 40, 80);

        QHBoxLayout * vbox = new QHBoxLayout(group);

        QLabel * tmLabel = new QLabel();
        tmLabel->setText("时间");
        tmLabel->setFont(labelFont);
        tmLabel->setStyleSheet("margin-left:20;");
        vbox->addWidget(tmLabel);
        QLineEdit * tmValue = new QLineEdit();
        tmValue->setFixedWidth(200);
        tmValue->setFont(labelFont);
        vbox->addWidget(tmValue);

        QLabel * dataLabel = new QLabel();
        dataLabel->setText("测量数据");
        dataLabel->setFont(labelFont);
        dataLabel->setStyleSheet("margin-left:20;");
        vbox->addWidget(dataLabel);
        QLineEdit * dataValue = new QLineEdit();
        dataValue->setFixedWidth(200);
        dataValue->setFont(labelFont);
        vbox->addWidget(dataValue);

        QLabel * idLabel = new QLabel();
        idLabel->setText("数据ID");
        idLabel->setFont(labelFont);
        idLabel->setStyleSheet("margin-left:20;");
        vbox->addWidget(idLabel);
        QLineEdit * idValue = new QLineEdit();
        idValue->setFixedWidth(75);
        idValue->setFont(labelFont);
        vbox->addWidget(idValue);

        QLabel * refChLabel = new QLabel();
        refChLabel->setText("参考通道");
        refChLabel->setFont(labelFont);
        refChLabel->setStyleSheet("margin-left:20;");
        vbox->addWidget(refChLabel);
        QLineEdit * refChValue = new QLineEdit();
        refChValue->setFixedWidth(60);
        refChValue->setFont(labelFont);
        vbox->addWidget(refChValue);

        QLabel * validLabel = new QLabel();
        validLabel->setText("-");
        validLabel->setFont(labelFont);
        validLabel->setStyleSheet("margin-left:20;");
        vbox->addWidget(validLabel);

        QLabel * clockLabel = new QLabel();
        clockLabel->setText("钟编号");
        clockLabel->setFont(labelFont);
        clockLabel->setStyleSheet("margin-left:20;");
        vbox->addWidget(clockLabel);
        QLineEdit * clockValue = new QLineEdit();
        clockValue->setFixedWidth(60);
        clockValue->setFont(labelFont);
        vbox->addWidget(clockValue);
        for (int i = 0; i < deviceList.size(); i++)
        {
            connect(clockValue, &QLineEdit::textChanged, deviceList.at(i), &CounterDevice::onClockChanged);
        }

        QLabel * delayLabel = new QLabel();
        delayLabel->setText("时延值(ns)");
        delayLabel->setFont(labelFont);
        delayLabel->setStyleSheet("margin-left:20;");
        vbox->addWidget(delayLabel);
        QLineEdit * delayValue = new QLineEdit();
        delayValue->setFixedWidth(100);
        delayValue->setFont(labelFont);
        vbox->addWidget(delayValue);
        for (int i = 0; i < deviceList.size(); i++)
        {
            connect(delayValue, &QLineEdit::textChanged, deviceList.at(i), &CounterDevice::onDelayChanged);
        }

        QSpacerItem * hSpace = new QSpacerItem(20, 20);
        hSpace->changeSize(20, 20, QSizePolicy::Expanding);
        vbox->addItem(hSpace);

        group->setLayout(vbox);

        layout->addWidget(group);
    }
}

void CounterWindow::drawCounterDataOnPage(CounterDataDto * counterData)
{
    // 当前显示的设备编号
    QString currentDevCode = ui->devSelect->currentData().toString();

    // 如果不是当前设备的帧,直接返回
    if (counterData->devCode != currentDevCode)
    {
        return;
    }

    // 更新所有通道BOX的值
    for (int i = 0; i < counterData->channelDataArray.size(); i++)
    {
        // 获取对应的通道BOX
        QGroupBox * channelBox = (QGroupBox *)ui->scrollContents->children().at(i + 1);

        // 赋值,对应的lineEdit/label
        ((QLineEdit *)channelBox->children().at(2))->setText(counterData->timestamp);
        ((QLineEdit *)channelBox->children().at(4))->setText(QString("%1 s").arg(counterData->channelDataArray.at(i)));
        ((QLineEdit *)channelBox->children().at(6))->setText(counterData->frameId);
        ((QLineEdit *)channelBox->children().at(8))->setText(QString("%1").arg(counterData->channelRefId));
        ((QLabel *)channelBox->children().at(9))->setText(counterData->channelActiveArray.at(i) == "1" ? "有效" : "无效");
        ((QLineEdit *)channelBox->children().at(11))->setText(SettingConfig::getInstance().CLOCK_ARR.at(0).at(i));
        ((QLineEdit *)channelBox->children().at(13))->setText(SettingConfig::getInstance().DELAY_ARR.at(0).at(i));
    }
}

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

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