错误: 聚合‘QDateTime time’类型不完全,无法被定义

本文介绍了一种常见的编程错误——使用QDateTime时出现的聚合类型定义不完整的问题,并给出了简单的解决方案:确保在头文件中包含了必要的QDateTime头文件。

错误: 聚合‘QDateTime time’类型不完全,无法被定义

呵呵,头文件中忘了#include <QDateTime>

#ifndef UDPHANDLER_H #define UDPHANDLER_H #include <QObject> #include <QUdpSocket> #include <QNetworkInterface> #include <QHostAddress> class UdpHandler : public QObject { Q_OBJECT public: explicit UdpHandler(QObject *parent = nullptr); // 初始化UDP套接字 bool initSocket(quint16 port); // 加入组播组 bool joinMulticastGroup(const QString &groupAddress); // 离开组播组 void leaveMulticastGroup(const QString &groupAddress); // 发送单播数据 void sendUnicast(const QByteArray &data, const QString &targetIp, quint16 targetPort); // 发送组播数据 void sendMulticast(const QByteArray &data, const QString &groupAddress, quint16 groupPort); signals: // 数据接收信号 void dataReceived(const QByteArray &data, const QString &senderIp, quint16 senderPort); // 错误信号 void errorOccurred(const QString &error); private slots: // 处理接收数据 void processPendingDatagrams(); private: QUdpSocket *m_udpSocket; QHostAddress m_currentGroup; }; #endif // UDPHANDLER_H UDPHANDLER.CPP C++ #include "UdpHandler.h" #include <QNetworkDatagram> UdpHandler::UdpHandler(QObject *parent) : QObject(parent), m_udpSocket(new QUdpSocket(this)), m_currentGroup() { connect(m_udpSocket, &QUdpSocket::readyRead, this, &UdpHandler::processPendingDatagrams); connect(m_udpSocket, QOverload<QAbstractSocket::SocketError>::of(&QAbstractSocket::error), [=](QAbstractSocket::SocketError){ emit errorOccurred(m_udpSocket->errorString()); }); } bool UdpHandler::initSocket(quint16 port) { if (m_udpSocket->state() == QAbstractSocket::BoundState) { m_udpSocket->close(); } // 绑定端口并设置共享地址选项 return m_udpSocket->bind(QHostAddress::Any, port, QUdpSocket::ShareAddress | QUdpSocket::ReuseAddressHint); } bool UdpHandler::joinMulticastGroup(const QString &groupAddress) { QHostAddress address(groupAddress); if (!address.isMulticast()) { emit errorOccurred(QString("无效的组播地址: %1").arg(groupAddress)); return false; } // 离开当前组(如果已加入) if (m_currentGroup != QHostAddress::Null) { leaveMulticastGroup(m_currentGroup.toString()); } // 加入组播组 if (m_udpSocket->joinMulticastGroup(address)) { m_currentGroup = address; return true; } return false; } void UdpHandler::leaveMulticastGroup(const QString &groupAddress) { QHostAddress address(groupAddress); if (address.isMulticast()) { m_udpSocket->leaveMulticastGroup(address); if (m_currentGroup == address) { m_currentGroup = QHostAddress::Null; } } } void UdpHandler::sendUnicast(const QByteArray &data, const QString &targetIp, quint16 targetPort) { m_udpSocket->writeDatagram(data, QHostAddress(targetIp), targetPort); } void UdpHandler::sendMulticast(const QByteArray &data, const QString &groupAddress, quint16 groupPort) { QHostAddress address(groupAddress); if (address.isMulticast()) { m_udpSocket->writeDatagram(data, address, groupPort); } } void UdpHandler::processPendingDatagrams() { while (m_udpSocket->hasPendingDatagrams()) { QNetworkDatagram datagram = m_udpSocket->receiveDatagram(); emit dataReceived(datagram.data(), datagram.senderAddress().toString(), datagram.senderPort()); } } 二、主界面实现(Widget) WIDGET.H C++ #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include "UdpHandler.h" namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = nullptr); ~Widget(); private slots: void on_btnBind_clicked(); void on_btnJoinGroup_clicked(); void on_btnSend_clicked(); void onDataReceived(const QByteArray &data, const QString &senderIp, quint16 senderPort); void onErrorOccurred(const QString &error); private: Ui::Widget *ui; UdpHandler *m_udpHandler; }; #endif // WIDGET_H WIDGET.CPP C++ #include "Widget.h" #include "ui_Widget.h" #include <QMessageBox> #include <QDateTime> #include <QNetworkInterface> Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget), m_udpHandler(new UdpHandler(this)) { ui->setupUi(this); // 设置默认值 ui->spinBindPort->setValue(8888); ui->txtGroupAddress->setText("224.0.0.100"); ui->spinTargetPort->setValue(8888); ui->radioMulticast->setChecked(true); // 连接信号槽 connect(m_udpHandler, &UdpHandler::dataReceived, this, &Widget::onDataReceived); connect(m_udpHandler, &UdpHandler::errorOccurred, this, &Widget::onErrorOccurred); } Widget::~Widget() { delete ui; } void Widget::on_btnBind_clicked() { quint16 port = ui->spinBindPort->value(); if (m_udpHandler->initSocket(port)) { ui->txtLog->append(QString("端口绑定成功: %1").arg(port)); } else { QMessageBox::warning(this, "绑定错误", "端口绑定失败"); } } void Widget::on_btnJoinGroup_clicked() { QString groupAddress = ui->txtGroupAddress->text().trimmed(); if (m_udpHandler->joinMulticastGroup(groupAddress)) { ui->txtLog->append(QString("加入组播组成功: %1").arg(groupAddress)); } else { QMessageBox::warning(this, "组播错误", "加入组播组失败"); } } void Widget::on_btnSend_clicked() { QString data = ui->txtSendData->toPlainText(); if (data.isEmpty()) { QMessageBox::warning(this, "发送错误", "发送内容能为空"); return; } QString target = ui->txtTargetAddress->text().trimmed(); quint16 port = ui->spinTargetPort->value(); if (ui->radioUnicast->isChecked()) { if (target.isEmpty()) { QMessageBox::warning(this, "发送错误", "目标地址能为空"); return; } m_udpHandler->sendUnicast(data.toUtf8(), target, port); ui->txtLog->append(QString("发送单播数据到 %1:%2").arg(target).arg(port)); } else { QString groupAddress = ui->txtGroupAddress->text().trimmed(); m_udpHandler->sendMulticast(data.toUtf8(), groupAddress, port); ui->txtLog->append(QString("发送组播数据到 %1:%2").arg(groupAddress).arg(port)); } } void Widget::onDataReceived(const QByteArray &data, const QString &senderIp, quint16 senderPort) { QString time = QDateTime::currentDateTime().toString("hh:mm:ss"); QString message = QString("[%1] From %2:%3\n%4") .arg(time, senderIp, QString::number(senderPort), QString::fromUtf8(data)); ui->txtRecvData->append(message); } void Widget::onErrorOccurred(const QString &error) { ui->txtLog->append("错误: " + error); }在此原代码的基础上,按照我的要求进行修改。1:将本地参数(如端口、套接字等)和外来参数(如目标地址、端口等)封装为个结构体。 2:将单播发送、组播发送、加入组播、离开组播操作整合到个成员函数mysend()中。3:将接收操作封装到个成员函数myreceive()中。在Widget类内部定义个UdpHandler类,这个类负责所有UDP相关的操作。 UdpHandler类提供初始化、加入组播、离开组播、发送数据(单播和组播)以及接收数据的功能。 在Widget类中包含个UdpHandler的成员对象,并在Widget的初始化中设置UdpHandler。 通过信号槽机制,将UdpHandler接收到的数据传递到Widget的界面显示。
最新发布
09-11
#include "mywidget.h" #include "ui_mywidget.h" #include <iostream> #include <QSerialPort> #include <QSerialPortInfo> #include <QDebug> #include <QMessageBox> #include <QTimer> #include <QTableWidgetItem> #include "Public.h" #include "Encry.h" #include <QFileDialog> #include <ActiveQt/QAxObject> #include <QFile> #include <QTime> #include <QDateTime> // QXlsx #include "xlsxdocument.h" #include "xlsxchartsheet.h" #include "xlsxcellrange.h" #include "xlsxchart.h" #include "xlsxrichstring.h" #include "xlsxworkbook.h" using namespace std; static unsigned long ulRandSend = 0x12345678; static unsigned long ulRandRec; myWidget::myWidget(QWidget *parent) : QWidget(parent) , ui(new Ui::myWidget) { ui->setupUi(this); ui->comboBox->clear(); setWindowIcon(QIcon(":/new/prefix1/ICO")); /************软件版本**********************************/ Version = "和阳电气测试工具-V1.2"; this->setWindowTitle(Version); /***************************************************/ //有数据,就触发readyRead信号,开启timer connect(&serial, &QSerialPort::readyRead, this, &myWidget::serialPort_readyRead); //自动搜索串口号 foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) { ui->comboBox->addItem(info.portName()); } qDebug()<<"搜索串口号完成"; timer1 = new QTimer(this); timer1->setTimerType(Qt::PreciseTimer); //提高定时器的精度 connect(timer1,&QTimer::timeout,this,&myWidget::DealRxData); //读取帧数据 timer2 = new QTimer(this); //定时发送 timer2->setTimerType(Qt::PreciseTimer); connect(timer2,&QTimer::timeout,this,&myWidget::SendFunction); timer3 = new QTimer(this); //接收超时 timer3->setTimerType(Qt::PreciseTimer); connect(timer3,&QTimer::timeout,this,&myWidget::RxTimeOut); currentRow = 1; ucDelayFlag = 0; ucFactoryFlag = 0; FormatFlag = 0; ExcelType = 0; ErrorOrEndFlag = 0; TestPswdLevel = 0; ucWaitFlag = 0; ui->tableWidget->clearContents(); //ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); ui->tableWidget->horizontalHeader()->setVisible(false); //连接excel,提前在构造函数里连接控件 excel = new QAxObject("Excel.Application"); //是否可视化excel excel->dynamicCall("SetVisible(bool Visible)", false); //是否弹出警告窗口 excel->setProperty("DisplayAlerts", false); //获取工作簿集合 workbooks = excel->querySubObject("WorkBooks"); } myWidget::~myWidget() { delete ui; } void myWidget::on_pushButton_clicked() { if(this->ui->pushButton->text() == "打开串口") { serial.setPortName(ui->comboBox->currentText()); //设置串口号 serial.setBaudRate(ui->comboBox_2->currentText().toInt()); //设置波特率 if(ui->comboBox_5->currentText()== "8") { serial.setDataBits(QSerialPort::Data8); }else if(ui->comboBox_5->currentText()== "7") { serial.setDataBits(QSerialPort::Data7); }else if(ui->comboBox_5->currentText()== "6") { serial.setDataBits(QSerialPort::Data6); } if(ui->comboBox_3->currentText() == "no") { serial.setParity(QSerialPort::NoParity); }else if(ui->comboBox_3->currentText() == "even") { serial.setParity(QSerialPort::EvenParity); }else{ serial.setParity(QSerialPort::OddParity); } if(ui->comboBox_4->currentText() == "1") { serial.setStopBits(QSerialPort::OneStop); }else if(ui->comboBox_4->currentText() == "2") { serial.setStopBits(QSerialPort::TwoStop); } serial.setFlowControl(QSerialPort::NoFlowControl); //打开串口 if(!serial.open(QIODevice::ReadWrite)) { QMessageBox::critical(NULL, "提示", "串口打开失败"); return; } qDebug() << "串口打开成功"; this->ui->pushButton->setText("关闭串口"); }else{ serial.close(); this->ui->pushButton->setText("打开串口"); qDebug() << "串口关闭成功"; } } //有数据来就出发,重启定时器 void myWidget::serialPort_readyRead() { timer1->start(3); } //接收数据完成,延时时间结束 void myWidget::DealRxData() { timer1->stop(); //关timer,读数据 RxLen = serial.bytesAvailable(); rx_buf= serial.readAll(); //QString rx_buf_tmp = QString::fromLocal8Bit(rx_buf); //转换为中文格式 //qDebug() << QString(RxLen); qDebug() << "我接收完毕"; // QString rx_buf_tmp = rx_buf.toHex().data(); //qDebug() << rx_buf_tmp; //qDebug() <<rx_buf; //ui->textBrowser->insertPlainText(rx_buf_tmp); #if 0 //测试数据用,误删! QString rx_buf_tmp = rx_buf.toHex(' ').data(); ui->textBrowser->append(rx_buf_tmp); #endif //rx_buf_tmp.clear(); //rx_buf.clear(); qDebug() << "处理1"; CommRxDeal(&rx_buf,RxLen); rx_buf.clear(); RxLen = 0; } /**********************************************接收处理开始*******************************************/ //等待返回数据超时出错处理 void myWidget::RxTimeOut() { timer3->stop(); if(HanshakeStep != HANDLE_SHAKE_OK) { QMessageBox::critical(NULL, "提示", "握手失败"); }else{ QMessageBox::critical(NULL, "提示", "超时未返回数据!"); } EnableOrDisableButtonFun(true); TxFlag = 0; //复位些标记位 currentRow = 1; TestPswdLevel = 0; ucFactoryFlag = 0; HanshakeStep = HANDLE_SHAKE_STEP1; } /******************************************接收处理结束*****************************************/ //开始测试按钮--开启 void myWidget::on_pushButton_3_clicked() { QMessageBox MessagesBox1; bool LineEdit_ID = ui->ExcelInfo_ID->text().isEmpty(); bool LineEdit_People = ui->ExcelInfo_People->text().isEmpty(); ucErrRecordCnt = 0; if(LineEdit_ID) //为空 { MessagesBox1.warning(this,"Warning","未获取到板卡编码信息,请使用扫码枪扫码"); return; } if(LineEdit_People) { MessagesBox1.warning(this,"Warning","未获取到测试人员信息,请填写测试人员"); return; } if(ui->tableWidget->item(1,0) == NULL) { QMessageBox::critical(NULL, "提示", "请先加载excel测试文件"); } else{ if(serial.isOpen()) { EnableOrDisableButtonFun(false); TxFlag = 1; timer2->start(20); //100ms轮询次要要发送数据 #if 0 QString tx_buf = ui->textEdit_3->toPlainText(); //读取文本输入框的内容 //发送 QByteArray tx_buf_tmp = tx_buf.toLocal8Bit(); //转换为标准字符,支持中文 //serial.write(tx_buf_tmp); //把数据通过串口发送出去 serial.write(QByteArray::fromHex(tx_buf.toLatin1())); //16进制发送 tx_buf.clear(); qDebug()<<"发送成功"; timer3->start(100); /* //读取个cell数据 QString str = ui->tableWidget->item(1,1)->text(); int b = str.toInt(); //写入个数据 ui->tableWidget->item(0,0)->setText(QString("%1").arg(b+1)); */ #endif }else{ QMessageBox::critical(NULL, "提示", "串口未打开!!"); } } } void myWidget::Qvariant2listlistVariant(const QVariant &var,QList<QList<QVariant>> &ret) { QVariantList varrows=var.toList(); const int rowcount=varrows.size(); QVariantList rowdata; if(varrows.isEmpty()) { return; }else{ for(int i=0;i<rowcount;i++) { rowdata=varrows[i].toList(); //将每行的值存入到list中 ret.push_back(rowdata); } } } unsigned short myWidget::GetMainIndex(QString temp) { QString str; QString str2; int Flag = 0; int InGroupOffest; unsigned short usMainIndex = 0; //return 0表示未查找到索引 if(temp.mid(0,2) == "0x") { return temp.toInt(NULL,16); } Flag = temp.indexOf('.'); if(3 == Flag) { str = temp.mid(0,3); //组别 str2 = temp.mid(4,2); //组内偏移 }else{ str = temp.mid(0,1)+'0'+temp.mid(1,1); //F1---F01------便于找索引组别(主要是门机) str2 = temp.mid(3,2); //组内偏移 } InGroupOffest = str2.toInt(); qDebug()<<str; qDebug()<<str2; for(int i=0;i<GroupIndexRows;i++) //查找对应索引 { if(str == CurrentMapAddr.at(i).at(0).toString()) { QString strVal=CurrentMapAddr.at(i).at(2).toString(); usMainIndex = strVal.toInt(NULL,16)+ InGroupOffest; return usMainIndex; } } return usMainIndex; } //握手请求 void myWidget::SendHandshakeData(void) { unsigned short usCRC; if(HanshakeStep!=HANDLE_SHAKE_OK) { if(HanshakeStep==HANDLE_SHAKE_STEP1) { xData.xAdu.mem.ucFun = FUN_CODE_HANDSHAKE; xData.xAdu.mem.ucData[0] = SUB_CODE_HANDSHAKE; xData.xAdu.mem.ucData[1] = ulRandSend>>24; xData.xAdu.mem.ucData[2] = (ulRandSend>>16)&0xff; xData.xAdu.mem.ucData[3] = (ulRandSend>>8)&0xff; xData.xAdu.mem.ucData[4] = ulRandSend&0xff; usCRC = N_CRC16(xData.xAdu.ucAll, 7); xData.xAdu.mem.ucData[5] = usCRC>>8; xData.xAdu.mem.ucData[6] = usCRC; xData.ucLen = 9; TxFlag = 0; qDebug()<<"握手第步执行!"; } else if(HanshakeStep==HANDLE_SHAKE_STEP2) { xData.xAdu.mem.ucFun = FUN_CODE_HANDSHAKE; xData.xAdu.mem.ucData[0] = SUB_CODE_ENCRYPT; //以下8个字节要用密文发送 if(0==ExcelType) //用于测试 { xData.xAdu.mem.ucData[1] = TEST_EQU_TYPE; xData.xAdu.mem.ucData[2] = TEST_USER_ID&0xff; xData.xAdu.mem.ucData[3] = TEST_USER_ID>>8; } else if(1==ExcelType) //用于出厂值-非标改制 { xData.xAdu.mem.ucData[1] = EQU_TYPE; xData.xAdu.mem.ucData[2] = USER_ID&0xff; xData.xAdu.mem.ucData[3] = USER_ID>>8; } xData.xAdu.mem.ucData[4] = 0; ulRandRec ^= ulRandSend; xData.xAdu.mem.ucData[5] = ulRandRec>>24; xData.xAdu.mem.ucData[6] = ulRandRec>>16; xData.xAdu.mem.ucData[7] = ulRandRec>>8; xData.xAdu.mem.ucData[8] = ulRandRec; One_DES_IV_Encrypt_Block(NULL, &xData.xAdu.mem.ucData[1], ucKey); usCRC = N_CRC16(xData.xAdu.ucAll, 11); xData.xAdu.mem.ucData[9] = usCRC>>8; xData.xAdu.mem.ucData[10] = usCRC; xData.ucLen = 13; TxFlag = 0; qDebug()<<"握手第二步执行!"; } else if(HanshakeStep==HANDLE_SHAKE_STEP3) { xData.xAdu.mem.ucFun = FUN_CODE_HANDSHAKE; xData.xAdu.mem.ucData[0] = SUB_CODE_ELEC_ID; usCRC = N_CRC16(xData.xAdu.ucAll, 3); xData.xAdu.mem.ucData[1] = usCRC>>8; xData.xAdu.mem.ucData[2] = usCRC; xData.ucLen = 5; TxFlag = 0; qDebug()<<"握手第三步执行!"; } else if(HanshakeStep==HANDLE_SHAKE_STEP4) { xData.xAdu.mem.ucFun = FUN_CODE_WRITE_MULTIPLE_CHILD_IDEX_16BIT; if(ExcelType) //开启出厂值操作命令 { if(ucFactoryFlag==0) { if(0 == TestPswdLevel) { xData.xAdu.mem.ucData[0] = FUN_SEL_MODE_INDEX>>8; xData.xAdu.mem.ucData[1] = FUN_SEL_MODE_INDEX&0xff; xData.xAdu.mem.ucData[7] = PASS_WORLD>>8; xData.xAdu.mem.ucData[8] = PASS_WORLD&0xff; TestPswdLevel = 1; }else{ xData.xAdu.mem.ucData[0] = FUN_UNLOCK_INDEX>>8; xData.xAdu.mem.ucData[1] = FUN_UNLOCK_INDEX&0xff; xData.xAdu.mem.ucData[7] = UNLOCK_DATA_CMD>>8; xData.xAdu.mem.ucData[8] = UNLOCK_DATA_CMD&0xff; TestPswdLevel= 0; } xData.xAdu.mem.ucData[2] = 0x00; xData.xAdu.mem.ucData[3] = 0x00; xData.xAdu.mem.ucData[4] = 0x02; xData.xAdu.mem.ucData[5] = 00; xData.xAdu.mem.ucData[6] = 00; usCRC = N_CRC16(xData.xAdu.ucAll, 11); xData.xAdu.mem.ucData[9] = usCRC>>8; xData.xAdu.mem.ucData[10] = usCRC; xData.ucLen = 13; TxFlag = 0; qDebug()<<"握手第三步-解锁权限执行!"; ucFactoryFlag=1; }else{ ResertFactoryCmd(RESERT_FACTROY_START_CMD); TxFlag = 0; ucFactoryFlag = 2; } }else{ #if 1 if(TestPswdLevel==0) { xData.xAdu.mem.ucData[0] = FUN_SEL_MODE_INDEX>>8; xData.xAdu.mem.ucData[1] = FUN_SEL_MODE_INDEX&0xff; xData.xAdu.mem.ucData[7] = PASS_WORLD>>8; xData.xAdu.mem.ucData[8] = PASS_WORLD&0xff; TestPswdLevel = 1; }else{ xData.xAdu.mem.ucData[0] = FUN_UNLOCK_INDEX>>8; xData.xAdu.mem.ucData[1] = FUN_UNLOCK_INDEX&0xff; xData.xAdu.mem.ucData[7] = UNLOCK_DATA_CMD>>8; xData.xAdu.mem.ucData[8] = UNLOCK_DATA_CMD&0xff; TestPswdLevel = 0; } xData.xAdu.mem.ucData[2] = 0x00; // 功能子码 xData.xAdu.mem.ucData[3] = 0x00; xData.xAdu.mem.ucData[4] = 0x02; xData.xAdu.mem.ucData[5] = 00; xData.xAdu.mem.ucData[6] = 00; usCRC = N_CRC16(xData.xAdu.ucAll, 11); xData.xAdu.mem.ucData[9] = usCRC>>8; xData.xAdu.mem.ucData[10] = usCRC; xData.ucLen = 13; TxFlag = 0; qDebug()<<"握手第三步-解锁权限执行!"; #endif } } } } //CmdVal:2开启命令3:结束命令 void myWidget::ResertFactoryCmd(unsigned char CmdVal) { unsigned short usCRC; xData.xAdu.mem.ucFun = FUN_CODE_WRITE_MULTIPLE_CHILD_IDEX_16BIT; xData.xAdu.mem.ucData[0] = RESERT_FACTROY_VALUE>>8; //主控板 xData.xAdu.mem.ucData[1] = RESERT_FACTROY_VALUE&0xff; xData.xAdu.mem.ucData[2] = 0; //功能子码 xData.xAdu.mem.ucData[3] = 0x00; xData.xAdu.mem.ucData[4] = 0x01; xData.xAdu.mem.ucData[5] = 0x00; xData.xAdu.mem.ucData[6] = CmdVal; usCRC = N_CRC16(xData.xAdu.ucAll, 9); xData.xAdu.mem.ucData[7] = usCRC>>8; xData.xAdu.mem.ucData[8] = usCRC; xData.ucLen = 11; } //定时发送函数 void myWidget::SendFunction(void) { unsigned short usCRC; unsigned short usMainIndex = 0; QString A,B,C; int i; if(TxFlag) { xData.xAdu.mem.ucAddr = SLAVE_ADDR; if(HanshakeStep!=HANDLE_SHAKE_OK) { SendHandshakeData(); }else{ QString strTemp; QString str1,str2,str3,str4; if(ErrorOrEndFlag) { ResertFactoryCmd(RESERT_FACTROY_END_CMD); TxFlag = 0; }else{ str2 = ui->tableWidget->item(currentRow,1)->text(); //组别 str4 = ui->tableWidget->item(currentRow,3)->text(); //出厂值 if(ExcelType) //出厂值命令 { str1 = "write"; str3 = "2"; }else{ str1 = ui->tableWidget->item(currentRow,0)->text(); //命令 str3 = ui->tableWidget->item(currentRow,2)->text(); //子索引 } if(str1 == "delay") { usMainIndex = DEALY_MAIN_INDEX; }else{ usMainIndex = GetMainIndex(str2); } if(0==usMainIndex) { QMessageBox::critical(NULL, "提示", "找主索引Map出错!"); }else{ if(str1 == "read" ) { if(str3.isEmpty()) //无子索引 { qDebug() << "没有子索引"; xData.xAdu.mem.ucFun = FUN_CODE_READ_MULTIPLE_REG_16BIT; xData.xAdu.mem.ucData[0] = usMainIndex>>8; xData.xAdu.mem.ucData[1] = usMainIndex&0xff; xData.xAdu.mem.ucData[2] = 0x00; xData.xAdu.mem.ucData[3] = 0x01; usCRC = N_CRC16(xData.xAdu.ucAll, 6); xData.xAdu.mem.ucData[4] = usCRC>>8; xData.xAdu.mem.ucData[5] = usCRC; xData.ucLen = 8; TxFlag = 0; }else{ //有子索引 xData.xAdu.mem.ucFun = FUN_CODE_READ_MULTIPLE_CHILD_IDEX_16BIT; xData.xAdu.mem.ucData[0] = usMainIndex>>8; xData.xAdu.mem.ucData[1] = usMainIndex&0xff; xData.xAdu.mem.ucData[2] = (unsigned char)str3.toInt(); xData.xAdu.mem.ucData[3] = 0x00; xData.xAdu.mem.ucData[4] = 0x01; usCRC = N_CRC16(xData.xAdu.ucAll, 7); xData.xAdu.mem.ucData[5] = usCRC>>8; xData.xAdu.mem.ucData[6] = usCRC; xData.ucLen = 9; //SubIndexflg = 1; TxFlag = 0; } } else if(str1 == "write" ) { i = str4.indexOf('.'); int value; if(str4.mid(0,2) == "0x") { value = str4.toInt(NULL,16); } else if(-1 == i) { value = str4.toInt(); }else{ value = (str4.mid(0,i)+str4.mid(i+1)).toInt(); } qDebug() << i; qDebug() << str4.toInt(); qDebug()<<usMainIndex; if(str3.isEmpty()) { qDebug() << "写命令,无子索引"; xData.xAdu.mem.ucFun = FUN_CODE_WRITE_SINGLE_REG_16BIT; xData.xAdu.mem.ucData[0] = usMainIndex>>8; xData.xAdu.mem.ucData[1] = usMainIndex&0xff; xData.xAdu.mem.ucData[2] = value>>8; xData.xAdu.mem.ucData[3] = value&0xff; usCRC = N_CRC16(xData.xAdu.ucAll, 6); xData.xAdu.mem.ucData[4] = usCRC>>8; xData.xAdu.mem.ucData[5] = usCRC; xData.ucLen = 8; TxFlag = 0; }else{ qDebug() << "写命令,有子索引"; xData.xAdu.mem.ucFun = FUN_CODE_WRITE_MULTIPLE_CHILD_IDEX_16BIT;//功能码 xData.xAdu.mem.ucData[2] = (unsigned char)str3.toInt(); if(ExcelType) //复位出厂值开始 { xData.xAdu.mem.ucData[0] = RESERT_FACTROY_VALUE>>8; xData.xAdu.mem.ucData[1] = RESERT_FACTROY_VALUE&0xff; xData.xAdu.mem.ucData[3] = 0x00; xData.xAdu.mem.ucData[4] = 0x03; xData.xAdu.mem.ucData[5] = usMainIndex>>8; //(出厂值索引地址)索引2+数据4个字节 xData.xAdu.mem.ucData[6] = usMainIndex&0xff; xData.xAdu.mem.ucData[7] = (value>>24)&0xff; xData.xAdu.mem.ucData[8] = (value>>16)&0xff; xData.xAdu.mem.ucData[9] = (value>>8)&0xff; xData.xAdu.mem.ucData[10] = value&0xff; usCRC = N_CRC16(xData.xAdu.ucAll, 13); xData.xAdu.mem.ucData[11] = usCRC>>8; xData.xAdu.mem.ucData[12] = usCRC; xData.ucLen = 15; }else{ //测试文件 xData.xAdu.mem.ucData[0] = usMainIndex>>8; xData.xAdu.mem.ucData[1] = usMainIndex&0xff; xData.xAdu.mem.ucData[3] = 0x00; xData.xAdu.mem.ucData[4] = 0x01; xData.xAdu.mem.ucData[5] = value>>8; xData.xAdu.mem.ucData[6] = value&0xff; usCRC = N_CRC16(xData.xAdu.ucAll, 9); xData.xAdu.mem.ucData[7] = usCRC>>8; xData.xAdu.mem.ucData[8] = usCRC; xData.ucLen = 11; } TxFlag = 0; } }else if(str1 == "delay" ) { ucDelayFlag = 1; #if 1 xData.xAdu.mem.ucFun = FUN_CODE_READ_MULTIPLE_CHILD_IDEX_16BIT;//功能码 xData.xAdu.mem.ucData[0] = 0x20; xData.xAdu.mem.ucData[1] = 0x00; xData.xAdu.mem.ucData[2] = 0x00; xData.xAdu.mem.ucData[3] = 0x00; xData.xAdu.mem.ucData[4] = 0x01; usCRC = N_CRC16(xData.xAdu.ucAll, 7); xData.xAdu.mem.ucData[5] = usCRC>>8; xData.xAdu.mem.ucData[6] = usCRC; xData.ucLen = 9; TxFlag = 0; #else xData.xAdu.mem.ucFun = FUN_CODE_WRITE_MULTIPLE_CHILD_IDEX_16BIT;//功能码 xData.xAdu.mem.ucData[0] = FUN_UNLOCK_INDEX>>8; // 功能子码 xData.xAdu.mem.ucData[1] = FUN_UNLOCK_INDEX&0xff; xData.xAdu.mem.ucData[2] = 0x00; // 功能子码 xData.xAdu.mem.ucData[3] = 0x00; xData.xAdu.mem.ucData[4] = 0x02; xData.xAdu.mem.ucData[5] = 00; xData.xAdu.mem.ucData[6] = 00; xData.xAdu.mem.ucData[7] = UNLOCK_DATA_CMD>>8; xData.xAdu.mem.ucData[8] = UNLOCK_DATA_CMD&0xff; usCRC = N_CRC16(xData.xAdu.ucAll, 11); xData.xAdu.mem.ucData[9] = usCRC>>8; xData.xAdu.mem.ucData[10] = usCRC; xData.ucLen = 13; TxFlag = 0; #endif } else if((str1 == "wait")&&(str3.isEmpty())) { ucWaitFlag = 1; qDebug() << "没有子索引"; xData.xAdu.mem.ucFun = FUN_CODE_READ_MULTIPLE_REG_16BIT; xData.xAdu.mem.ucData[0] = usMainIndex>>8; xData.xAdu.mem.ucData[1] = usMainIndex&0xff; xData.xAdu.mem.ucData[2] = 0x00; xData.xAdu.mem.ucData[3] = 0x01; usCRC = N_CRC16(xData.xAdu.ucAll, 6); xData.xAdu.mem.ucData[4] = usCRC>>8; xData.xAdu.mem.ucData[5] = usCRC; xData.ucLen = 8; TxFlag = 0; } } } } serial.write((const char *)xData.xAdu.ucAll,xData.ucLen); qDebug() << "我发送出去了"; timer3->start(500); //接收超时 } //qDebug() << "我在判断发发数据"; qDebug() << currentRow; } void myWidget:: HandShake(ADU * pxData,unsigned char uclen) { if(HanshakeStep==HANDLE_SHAKE_STEP1) { ulRandRec = pxData->mem.ucData[1]; ulRandRec = (ulRandRec<<8) + pxData->mem.ucData[2]; ulRandRec = (ulRandRec<<8) + pxData->mem.ucData[3]; ulRandRec = (ulRandRec<<8) + pxData->mem.ucData[4]; HanshakeStep = HANDLE_SHAKE_STEP2; TxFlag = 1; qDebug()<< "握手第步接收完毕"; } else if(HanshakeStep==HANDLE_SHAKE_STEP2) { HanshakeStep = HANDLE_SHAKE_STEP3; TxFlag = 1; qDebug()<< "握手第二步接收完毕"; } else if(HanshakeStep==HANDLE_SHAKE_STEP3) { //HanshakeStep = HANDLE_SHAKE_OK; HanshakeStep = HANDLE_SHAKE_STEP4; TxFlag = 1; qDebug()<< "握手第三步接收完毕"; } else if(HanshakeStep==HANDLE_SHAKE_STEP4) //解锁到无密码最高模式 { if(ExcelType) //复位出厂值 { if(ucFactoryFlag==2) { ucFactoryFlag = 0; HanshakeStep = HANDLE_SHAKE_OK; } }else{ HanshakeStep = HANDLE_SHAKE_OK; } TxFlag = 1; qDebug()<< "解锁到无密码最高模式"; }else{ HanshakeStep = HANDLE_SHAKE_STEP1; QMessageBox::critical(NULL, "提示", "握手失败"); TxFlag = 0; currentRow = 1; HanshakeStep = HANDLE_SHAKE_STEP1; timer1->stop(); timer2->stop(); timer3->stop(); } } void myWidget::TestResultIsTrue(void) { ui->tableWidget->setItem(currentRow,TestResultColumn,new QTableWidgetItem("PASS")); ui->tableWidget->item(currentRow,TestResultColumn)->setBackground(QBrush(QColor(0, 255, 0))); } //预留-ulData用于对比标准值,便于判定问题 void myWidget::TestResultIsFalse(unsigned int ulData) { #if 0 ui->tableWidget->setItem(currentRow,TestResultColumn,new QTableWidgetItem(QString("%1").arg(ulData))); #else ui->tableWidget->setItem(currentRow,TestResultColumn,new QTableWidgetItem("FAIL")); #endif ui->tableWidget->item(currentRow,TestResultColumn)->setBackground(QBrush(QColor(255,0, 0))); } void myWidget::DealReadSigIndex(unsigned char * data) { static unsigned short Cnt = 0; int ulValue = 0; int DnTemp; int UpTemp; int tablevalue; //对比的标准值 //取结果 ulValue = data[1]; ulValue = (ulValue<<8)|data[2]; QString str = ui->tableWidget->item(currentRow,3)->text(); int res = str.indexOf('~'); if(-1 == res) //没有范围,只有个值 { tablevalue = str.toInt(); if((1==ucWaitFlag)&&(tablevalue == ulValue)) { ucWaitFlag = 0; TestResultIsTrue(); } else if((1==ucWaitFlag)&&(tablevalue != ulValue)) //主控板按键检测 { Cnt++; if(Cnt>=2500) { Cnt = 0; ucWaitFlag = 0; //直没有正确动作,结束本次测试 timer2->stop(); timer3->stop(); timer1->stop(); HanshakeStep = HANDLE_SHAKE_STEP1; FinalTestResults(); EnableOrDisableButtonFun(true); currentRow = 1; TxFlag = 0; }else{ TxFlag = 1; } return; } else if(tablevalue == ulValue) { TestResultIsTrue(); }else{ TestResultIsFalse(ulValue); } }else{ //有范围 DnTemp = str.mid(0,res).toInt(); UpTemp = str.mid(res+1).toInt(); if((ulValue>=DnTemp)&&(ulValue<=UpTemp)) { TestResultIsTrue(); }else{ TestResultIsFalse(ulValue); } } currentRow++; TxFlag = 1; } void myWidget::DealReadSubIndex(unsigned char * data) { int ulValue = 0; int DnTemp; int UpTemp; int tablevalue; //对比的标准值 static unsigned short usCnt = 0; //取结果 ulValue = data[1]; ulValue = (ulValue<<8)|data[2]; #if 1 int delayData = (ui->tableWidget->item(currentRow,1)->text().toInt())/4; if(ucDelayFlag) { usCnt++; if(usCnt >= delayData) { usCnt = 0; ucDelayFlag = 0; TestResultIsTrue(); currentRow++; } TxFlag = 1; return; } #endif QString str = ui->tableWidget->item(currentRow,3)->text(); int res = str.indexOf('~'); if(-1 == res) //没有范围,只有个值 { tablevalue = str.toInt(); if(tablevalue == ulValue) { TestResultIsTrue(); }else{ TestResultIsFalse(ulValue); } }else{ //有范围 DnTemp = str.mid(0,res).toInt(); UpTemp = str.mid(res+1).toInt(); if((ulValue>=DnTemp)&&(ulValue<=UpTemp)) { TestResultIsTrue(); }else{ TestResultIsFalse(ulValue); } } currentRow++; TxFlag = 1; } void myWidget::DealWriteSigIndex(unsigned char * data) { QString A,B,C; int temp1,temp2; temp1 = data[2]; temp1 = (temp1<<8) | data[3]; QString str = ui->tableWidget->item(currentRow,3)->text(); int res = str.indexOf('.'); if(-1 == res) { temp2 = str.toInt(); }else{ A = str.mid(0,res); B = str.mid(res+1); C = A+B; temp2 = C.toInt(); } if(temp1 == temp2) { TestResultIsTrue(); }else{ TestResultIsFalse(temp1); } currentRow++; TxFlag = 1; } void myWidget::EnableOrDisableButtonFun(bool Val) { ui->pushButton_3->setEnabled(Val); ui->pushButton_5->setEnabled(Val); } void myWidget::DealWriteSubIndex(unsigned char * data) { int Temp1; if(ExcelType) { if(ErrorOrEndFlag) { ErrorOrEndFlag = 0; timer2->stop(); timer3->stop(); TxFlag = 0; HanshakeStep = HANDLE_SHAKE_STEP1; Delay_MSec(3000); QString str = "复位出厂值成功至" + QString::number(currentRow,10)+"行"; QMessageBox::information(NULL, "提示", str); EnableOrDisableButtonFun(true); }else{ TestResultIsTrue(); } }else{ Temp1 = data[3]; Temp1 = (Temp1<<8) | data[4]; if(Temp1 == 1) { TestResultIsTrue(); }else{ TestResultIsFalse(Temp1); } } currentRow++; TxFlag = 1; } void myWidget::FinalTestResults(void) { unsigned char i,j,k; unsigned short usStartWriteRow; QXlsx::Format format1,format2,format3,format4,format5,format6; QDateTime CurrTime; QString String_Time1; QVariant Variant_ID,Variant_People,Variant_Time,Variant_Type,Variant_Result,Variant_ErrInfo; QString String_ID,String_People,String_Time,String_Type,String_Result,String_ErrInfo,String_ErrInfo1; QMessageBox MessagesBox_excelSave; ucErrRecord[0] = 0; ucErrRecord[1] = 0; ucErrRecord[2] = 0; ucErrRecord[3] = 0; ucErrRecord[4] = 0; ucHasBeenTested = 0; ucErrRecordCnt = 0; QStringList errorList; for(int i = 1; i < DataRowNum; i++) { if(ui->tableWidget->item(i, TestResultColumn)->text() == "FAIL") { QString errorDesc = ui->tableWidget->item(i, 5)->text(); errorList.append(errorDesc); } } String_ErrInfo.clear(); for(int i = 0; i < errorList.size(); ++i) { String_ErrInfo += QString("%1. %2\n").arg(i+1).arg(errorList.at(i)); } for(i=1;i<DataRowNum;i++) { if(ui->tableWidget->item(i,TestResultColumn)->text() != "PASS") { ucHasBeenTested = i; } } // if(ucHasBeenTested == 0) // { // QMessageBox TrueMsg; // TrueMsg.setText("测试通过!测试结果已记录于Excel表中"); // TrueMsg.exec(); // } String_ID = ui->ExcelInfo_ID->text(); Variant_ID = QVariant(String_ID); String_People = ui->ExcelInfo_People->text(); Variant_People = QVariant(String_People); CurrTime =QDateTime::currentDateTime(); String_Time = CurrTime.toString("yyyy.MM.dd hh:mm:ss ddd"); Variant_Time = QVariant(String_Time); if(ucHasBeenTested) { String_Result = errorList.isEmpty() ? "PASS" : "FAIL"; Variant_Result = QVariant(String_Result); Variant_ErrInfo = QVariant(String_ErrInfo); } else { String_Result = "PASS"; String_ErrInfo = ""; } Variant_Result = QVariant(String_Result); Variant_ErrInfo = QVariant(String_ErrInfo); //String_Time1 = CurrTime.toString("yyyy.MM.dd"); // QString FileName_String_Time = String_Time1 + "板卡测试记录.xlsx"; // qDebug()<<FileName_String_Time; //QXlsx::Document xlsx(FileName_String_Time); QString FileName_String_ID = String_ID + "板卡测试记录.xlsx"; qDebug()<<FileName_String_ID; QXlsx::Document xlsx(FileName_String_ID); if(ui->tableWidget->item(1,0) == NULL) { QMessageBox::critical(NULL, "提示", "请先加载excel测试文件"); return; } // else // { // if(!ucHasBeenTested) //未测试通过 // { // QMessageBox::critical(NULL, "提示", "测试未通过,禁止写入"); // return; // } // } // for(int i=1;i<DataRowNum;i++) // { // if(ui->tableWidget->item(i,TestResultColumn)->text() != "PASS") // { // MessagesBox_excelSave.warning(this,"Warning","测试有未通过项目,禁止写入"); // return; // } // } //Excel_Info_Type = 2; //Test if(Excel_Info_Type == 0) { MessagesBox_excelSave.warning(this,"Warning","未获取到板卡类型信息,请选择正确的测试文件并测试通过"); return; } if(Excel_Info_Type == 1) { String_Type = "HY_ZKB--主控板"; Variant_Type = QVariant(String_Type); } else if(Excel_Info_Type == 2) { String_Type = "HY_JDB--轿顶板"; Variant_Type = QVariant(String_Type); } else if(Excel_Info_Type == 3) { String_Type = "HY_ZLB--指令板"; Variant_Type = QVariant(String_Type); } else if(Excel_Info_Type == 4) { String_Type = "HY_QDB--驱动板"; Variant_Type = QVariant(String_Type); } format1.setFontBold(true); format1.setFontSize(22); format1.setHorizontalAlignment(QXlsx::Format::AlignHCenter); format1.setVerticalAlignment(QXlsx::Format::AlignVCenter); format2.setFontBold(true); format2.setFontColor(QColor(Qt::blue)); format2.setFontSize(30); format2.setHorizontalAlignment(QXlsx::Format::AlignHCenter); format2.setVerticalAlignment(QXlsx::Format::AlignTop); format3.setFontSize(15); format3.setHorizontalAlignment(QXlsx::Format::AlignHCenter); format3.setVerticalAlignment(QXlsx::Format::AlignVCenter); format4.setFontBold(true); format4.setFontSize(15); if(ucHasBeenTested) { format4.setFontColor(QColor(Qt::red)); } else { format4.setFontColor(QColor(Qt::green)); } format4.setHorizontalAlignment(QXlsx::Format::AlignHCenter); format4.setVerticalAlignment(QXlsx::Format::AlignVCenter); format5.setFontSize(11); format5.setFontColor(QColor(Qt::red)); format5.setHorizontalAlignment(QXlsx::Format::AlignHCenter); format5.setVerticalAlignment(QXlsx::Format::AlignVCenter); format6.setHorizontalAlignment(QXlsx::Format::AlignHCenter); QString ExcelA1Value = "和阳电气板卡测试记录表---" + String_ID; xlsx.setRowHeight(1,60); xlsx.write("A1",ExcelA1Value); xlsx.mergeCells("A1:E1"); xlsx.setRowFormat(1,format2); xlsx.setRowHeight(2,25); xlsx.setColumnWidth(1,6,35); xlsx.write(2, 1, "产品编码"); xlsx.write(2, 2, "测试人员"); xlsx.write(2, 3, "测试时间"); xlsx.write(2, 4, "测试板卡型号"); xlsx.write(2, 5, "测试结果"); //xlsx.write(4, 1, "故障信息"); xlsx.setRowFormat(2, format1); xlsx.setRowHeight(4,25); xlsx.write("A4","测试信息"); xlsx.mergeCells("A4:E4"); xlsx.setRowFormat(4,format1); // //从第三行开始判断哪行未空,为空则将当前测试记录填写进入这行 // for(int i=3;i<10000;i++) // { // QXlsx::Cell *cellA1 = xlsx.cellAt(i,1); // if(cellA1 == NULL) // { // usStartWriteRow = i; // qDebug("usStartWriteRow = %d",usStartWriteRow); // break; // } // } xlsx.setRowHeight(3,60); xlsx.setColumnWidth(1,6,35); xlsx.write(3, 1, Variant_ID); xlsx.write(3, 2, Variant_People); xlsx.write(3, 3, Variant_Time); xlsx.write(3, 4, Variant_Type); xlsx.write(3, 5, Variant_Result,format4); xlsx.setRowFormat(3, format3); // 写入每个测试项的结果到第五列,并设置颜色 for(int i = 1; i < DataRowNum; i++) { if(i<13) { QString result = ui->tableWidget->item(i, TestResultColumn)->text(); QXlsx::Format cellFormat; if(result == "PASS") { cellFormat.setPatternBackgroundColor(QColor(0, 255, 0)); // 绿色背景 } else { cellFormat.setPatternBackgroundColor(QColor(255, 0, 0)); // 红色背景 } xlsx.setRowFormat(i+4, format6); xlsx.write(i + 4, 1, i); xlsx.write(i + 4, 3, result, cellFormat); xlsx.write(i + 4, 2, ui->tableWidget->item(i, 5)->text(),cellFormat); xlsx.setRowHeight(i+4,25); } } // xlsx.write(5,1,String_ErrInfo,format5); // xlsx.setRowHeight(5,25); // xlsx.write("A5",String_ErrInfo); // xlsx.mergeCells("A5:E5"); // xlsx.setRowFormat(5,format5); xlsx.saveAs(FileName_String_ID); if(ucHasBeenTested) { MessagesBox_excelSave.information(this,"Infomation","测试有未通过项!测试结果已保存于Excel表中"); } else { MessagesBox_excelSave.information(this,"Infomation","测试通过!测试结果已保存于Excel表中"); } workbook->dynamicCall("Close()"); //关闭工作簿 ucErrRecordCnt = 0; ui->ExcelInfo_ID->setText(""); ui->ExcelInfo_People->setText(""); } //处理 void myWidget::CommRxDeal(QByteArray *RxData,unsigned char uclen) { //unsigned char * pxdata = reinterpret_cast<unsigned char*>(RxData->data()); //转成unsigned char if(0==uclen) return; qDebug() << "处理2"; ADU * pxRxData = (ADU *)RxData->data(); if((0==N_CRC16(pxRxData->ucAll,uclen))&&(SLAVE_ADDR==pxRxData->mem.ucAddr)) { qDebug() << "处理3"; qDebug()<< "接收数据校验通过"; if(HanshakeStep!=HANDLE_SHAKE_OK) { if((TestPswdLevel==1)&&(pxRxData->mem.ucFun&0x80)&&(ucFactoryFlag==1)) { ucFactoryFlag = 0; TxFlag = 1; return; //此处是密码试探阶段,报错 } HandShake(pxRxData,uclen); }else{ if(pxRxData->mem.ucFun&0x80) { if(ExcelType) { ErrorOrEndFlag = 1; } qDebug()<< "返回异常"; TestResultIsFalse(pxRxData->mem.ucFun&0x80); currentRow++; TxFlag = 1; }else{ switch(pxRxData->mem.ucFun) { case FUN_CODE_READ_MULTIPLE_REG_16BIT: DealReadSigIndex(pxRxData->mem.ucData); break; case FUN_CODE_READ_MULTIPLE_CHILD_IDEX_16BIT: DealReadSubIndex(pxRxData->mem.ucData); break; case FUN_CODE_WRITE_SINGLE_REG_16BIT: DealWriteSigIndex(pxRxData->mem.ucData); break; case FUN_CODE_WRITE_MULTIPLE_CHILD_IDEX_16BIT: DealWriteSubIndex(pxRxData->mem.ucData); break; default: break; } } qDebug()<< "数据错误"; ui->tableWidget->scrollToItem(ui->tableWidget->item(currentRow,0)); if(currentRow >= DataRowNum) { if(ExcelType) { ErrorOrEndFlag = 1; }else{ timer2->stop(); timer3->stop(); timer1->stop(); TxFlag = 0; HanshakeStep = HANDLE_SHAKE_STEP1; FinalTestResults(); EnableOrDisableButtonFun(true); currentRow = 1; qDebug() << "我发送出去了"; } } } } //QMessageBox::critical(NULL, "提示", "串口未打开!!"); } //复位excel测试结果 void myWidget::on_pushButton_5_clicked() { if(ui->tableWidget->item(0,0) != NULL) { for(int i=1;i<DISPLAY_MAX_ROW_NUM;i++) { ui->tableWidget->setItem(i,TestResultColumn,new QTableWidgetItem(" ")); ui->tableWidget->item(i,TestResultColumn)->setBackground(QBrush(QColor(255, 255, 255))); } } ErrorOrEndFlag = 0; TxFlag = 0; currentRow = 1; //currentColumn = 0; TestPswdLevel = 0; ucFactoryFlag = 0; HanshakeStep = HANDLE_SHAKE_STEP1; } //搜索串口号 void myWidget::on_pushButton_6_clicked() { foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) { ui->comboBox->clear(); ui->comboBox->addItem(info.portName()); } } //打开文件 void myWidget::on_pushButton_2_clicked() { //int StrIndexSize; this->setWindowTitle(Version); currentRow = 1; ucDelayFlag = 0; ucFactoryFlag = 0; FormatFlag = 0; ExcelType = 0; ErrorOrEndFlag = 0; TestPswdLevel = 0; QString TitleStr; CurrentMapAddr.clear(); //每次打开先清掉旧数据Map ui->tableWidget->clearContents(); //清掉内容 QString ProjectPatch = QCoreApplication::applicationDirPath(); //tr("RSTfile(*.RST);;excelfile(*.xlsm)") QString OpenfileName = QFileDialog::getOpenFileName(this, tr("选择打开文件"), ProjectPatch, tr("AllExcelfile(*.xlsm *.xlsx);;ExcelFormat1(*.xlsm);;ExcelFormat2(*.xlsx)")); //判断测试的板卡类型 QString String_ZKB,String_JDB,String_ZLB,String_QDB; String_ZKB = "H500"; String_JDB = "JDB"; String_ZLB = "ZLB"; String_QDB = "QDB"; bool OpenfileNameCompare1 = OpenfileName.contains(String_ZKB); bool OpenfileNameCompare2 = OpenfileName.contains(String_JDB); bool OpenfileNameCompare3 = OpenfileName.contains(String_ZLB); bool OpenfileNameCompare4 = OpenfileName.contains(String_QDB); if(OpenfileNameCompare1 == true) { Excel_Info_Type = 1; } else if(OpenfileNameCompare2 == true) { Excel_Info_Type = 2; } else if(OpenfileNameCompare3 == true) { Excel_Info_Type = 3; } else if(OpenfileNameCompare4 == true) { Excel_Info_Type = 4; } else { Excel_Info_Type = 0; } if(OpenfileName.isNull()) { return; } qDebug() << OpenfileName; TitleStr = Version + OpenfileName.mid(OpenfileName.lastIndexOf('/')); this->setWindowTitle(TitleStr); //excel测试文件 qDebug() << OpenfileName; //打开个工作簿 workbooks->dynamicCall("Open(const QString&)", QDir::toNativeSeparators(OpenfileName)); //获取当前工作簿 workbook = excel->querySubObject("ActiveWorkBook"); //获取工作表格集合 worksheets = workbook->querySubObject("Sheets"); //获取当前工作表格1,即sheet1 worksheet = worksheets->querySubObject("Item(int)", 1); //重置UsedRange清除历史格式 worksheet->querySubObject("UsedRange")->dynamicCall("ClearFormats()"); QAxObject *usedrange=worksheet->querySubObject("UsedRange"); //获取整个worksheet的范围 //获取行数 QAxObject * rows = usedrange->querySubObject("Rows"); int iRows = rows->property("Count").toInt(); DataRowNum = iRows; qDebug() << QString("行数为: %1").arg(QString::number(iRows)); //获取列数 QAxObject * columns = usedrange->querySubObject("Columns"); int iColumns = columns->property("Count").toInt(); qDebug() << QString("列数为: %1").arg(QString::number(iColumns)); //iRows = 1000; //划区域 QString Range = "A1:F"+QString::number(iRows); //E QAxObject *allEnvData = worksheet->querySubObject("Range(QString)", Range); QVariant cell = allEnvData->property("Value"); //QVariant cell = usedrange->dynamicCall("value");//将worksheet的全部内容存储在QVariant变量中 QList<QList<QVariant>> ret; //将Qvariant转换为QList<QList<QVariant>> Qvariant2listlistVariant(cell,ret); //注意容器和控件的大小,避免出现qlist越界的问题! for(int i=0;i<iRows;i++) { for(int j=0;j<EXCEL_DATA_COLUMN+2;j++) //列 { QString strVal=ret.at(i).at(j).toString(); ui->tableWidget->setItem(i,j,new QTableWidgetItem(strVal)); ui->tableWidget->item(i,j)->setTextAlignment(Qt::AlignVCenter|Qt::AlignHCenter); } } //区分文件类型,或者在excel文件第行声明,表明此文件用处 if((ui->tableWidget->item(0,0)->text()=="组别")&&(ui->tableWidget->item(0,3)->text() == "默认值"))//表示出厂值 { ExcelType = 1; TestResultColumn = 6; } else if((ui->tableWidget->item(0,0)->text()=="命令")&&(ui->tableWidget->item(0,3)->text() == "标准值")) { ExcelType = 0; TestResultColumn = 4; }else{ QMessageBox::critical(NULL, "提示", "测试文件格式错误,请检查格式"); } /* StrIndexSize = ui->tableWidget->item(1,1)->text().size(); if(6==StrIndexSize) { FormatFlag =1; //F01:00 } else if(5==StrIndexSize) //F1:00 { FormatFlag = 0; }else{ QMessageBox::critical(NULL, "提示", "测试文件格式错误,请检查格式"); } */ //读取要测试文件MAP,保存到容器 worksheet = worksheets->querySubObject("Item(int)", 2); usedrange = worksheet->querySubObject("UsedRange"); //获取行数 rows = usedrange->querySubObject("Rows"); int iRows1 = rows->property("Count").toInt(); GroupIndexRows = iRows1; qDebug() << QString("行数为: %1").arg(QString::number(iRows1)); //获取列数 columns = usedrange->querySubObject("Columns"); int iColumns1 = columns->property("Count").toInt(); qDebug() << QString("列数为: %1").arg(QString::number(iColumns1)); //cell = usedrange->dynamicCall("value");//将worksheet的全部内容存储在QVariant变量中 QString Range2 = "A2:C"+QString::number(iRows1); QAxObject *allEnvData1 = worksheet->querySubObject("Range(QString)", Range2); QVariant cell1 = allEnvData1->property("Value"); Qvariant2listlistVariant(cell1,CurrentMapAddr); //当前文件的索引MAP保存到list #if 0 for(int i=0;i<iRows1;i++) { QString strVal=CurrentMapAddr.at(i).at(2).toString(); int data = strVal.toInt(NULL,16); //将单元格的内容放置在table表中 qDebug() << strVal; } #endif //excel->dynamicCall("Quit()"); //关闭excel---连接控件缓慢,打开次后 } void myWidget::Delay_MSec(unsigned int msec) { QTime _Timer = QTime::currentTime().addMSecs(msec); while( QTime::currentTime() < _Timer ) QCoreApplication::processEvents(QEventLoop::AllEvents, 100); } void myWidget::on_pushButton_4_clicked() { } 代码分析
06-07
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值