#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()
{
}
代码分析