#include "PhaseWindow.h" #include "ui_PhaseWindow.h" #include <iostream> #include <QTimer> #include <QDateTime> #include <QLabel> #include <QGroupBox> #include <QLineEdit> #include <QPushButton> #include <QHBoxLayout> #include <QDesktopWidget> #include <QThread> 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->line->setGeometry(0, 59, screenRect.width(), 1); // 设置主体区域的大小和位置 ui->scrollArea->setGeometry(0, 60, screenRect.width(), screenRect.height() - 60); ui->scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); httpReq = new HttpRequestController(this); // 1. 获取访问接口需要的token int retCode = this->initHttpToken(); if (retCode != 200) { QMessageBox::information(this, "错误", "获取http请求的token失败,程序即将退出"); QTimer::singleShot(1000, qApp, SLOT(quit())); } // 2. 获取字典值:设备类型 retCode = this->initDictDeviceTypes(); // 3. 获取比相仪设备列表 QJsonObject devListRes = this->initDeviceList(); if (devListRes.find("code")->toInt() == 200) { ui->devSelect->clear(); // 4. 将获取到的设备添加到下拉列表框中 QJsonArray devArray = devListRes.find("data")->toArray(); for (int i = 0; i < devArray.size(); i++) { QJsonObject devItem = devArray.at(i).toObject(); ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem.find("deviceNo")->toString()); PhaseDevice * device = new PhaseDevice(this); deviceList.append(device); device->setComName(devItem.find("linkComName")->toString()); device->setBaudRate(SettingConfig::getInstance().BAUD_RATE); device->setDevCode(devItem.find("deviceNo")->toString()); device->setDeviceId(devItem.find("deviceId")->toString()); connect(device, &PhaseDevice::sendDataToDraw, this, &PhaseWindow::drawPhaseDataOnPage); device->initSerialPort(); QThread::msleep(100); device->startWork(); } // 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(); } PhaseWindow::~PhaseWindow() { delete ui; } void PhaseWindow::drawPhaseDataOnPage(PhaseDataDto * phaseData) { // 当前显示的设备编号 QString currentDevCode = ui->devSelect->currentData().toString(); // 如果不是当前设备的帧,直接返回 if (phaseData->devCode != currentDevCode) { return; } // 更新所有通道BOX的值 for (int i = 0; i < phaseData->channelActive.size(); i++) { // 获取对应的通道BOX QGroupBox * channelBox = (QGroupBox *)ui->scrollContents->children().at(i + 1); // 赋值,对应的lineEdit/label ((QLineEdit *)channelBox->children().at(2))->setText(phaseData->timestamp); ((QLineEdit *)channelBox->children().at(4))->setText(QString("%1 s").arg(phaseData->channelDataStr.at(i))); ((QLineEdit *)channelBox->children().at(6))->setText(phaseData->frameId); ((QLabel *)channelBox->children().at(7))->setText(phaseData->channelActive.at(i) == "1" ? "有效" : "无效"); } } void PhaseWindow::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(250); 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(100); idValue->setFont(labelFont); vbox->addWidget(idValue); QLabel * validLabel = new QLabel(); validLabel->setText("-"); validLabel->setFont(labelFont); validLabel->setStyleSheet("margin-left:20;"); vbox->addWidget(validLabel); QSpacerItem * hSpace = new QSpacerItem(20, 20); hSpace->changeSize(20, 20, QSizePolicy::Expanding); vbox->addItem(hSpace); group->setLayout(vbox); layout->addWidget(group); } } int PhaseWindow::initHttpToken() { QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, SettingConfig::getInstance().APP_KEY); return response.find("code")->toInt(); } int PhaseWindow::initDictDeviceTypes() { QJsonObject response = httpReq->initDictDeviceType(); return response.find("code")->toInt(); } QJsonObject PhaseWindow::initDeviceList() { QJsonObject response = httpReq->initDeviceList("比相仪"); return response; } void PhaseWindow::on_minButt_clicked() { setWindowState(Qt::WindowMinimized | windowState()); } void PhaseWindow::on_exitButt_clicked() { QApplication::exit(0); }