1.字符串拆分
我们要拆分这样一个字符串:
\r\n1\r\n>\r\nAPC\r\n>\r\n-60.00 dBm\r\n>\r\nInvalid parameters\r\n>\r\n29.3 C\r\n>\r\n30.7 C\r\n>\r\n30.1 C\r\n>\r\n30.1 C\r\n>\r\nPUMP1: 2.5 mA\r\nPUMP2: 53.2 mA\r\n
我们要提取想要的信息,就要将不想要的字符去除掉:
QStringList list = rxbuf.split(QRegExp("[\r\n>]"),QString::SkipEmptyParts);
去除完毕之后会拆分出相应的列表组:我们定义一个字符串类型来存放它们。
QString STAT = list[0];
QString MODE = list[1];
QString INPO = list[2];
QString OUTO = list[3];
QString NMTE = list[4];
QString HITE = list[5];
QString MOTE = list[6];
QString CATE = list[7];
QString PUM1 = list[8];
QString PUM2 = list[9];
QString ILT = list[10];
QString OLT = list[11];
QString PTARGET = list[12];
之后将其用laber来显示:
QString INPOnum = INPO;
ui->lblIndBm->setText(INPOnum);
ui->lblIndBm->setStyleSheet("color:rgb(0,255,0)");
2. 字符串发送:
2.1 PushButton
对于固定的字符串指令,我们可以这样书写,通过按钮的clicked()信号来释放其功能:
void masMainWindow::on_btnOpen_clicked()
{
QString buf = "set mute 0\r\n";
const char *temp=buf.toLocal8Bit().data();
currentPort->write(temp);
}
对于获取相应值再发送的字符串指令,我们可以这样处理:
2.2 PushButton+SpinBox
假如我们要发送:"set ilt -8.00 \r\n"
我们可以将其分成三个字符串:set ilt -8.00 \r\n
其中中间的数值我们是通过SpinBox来获取的。那么获取其字符串类型后还要将其转化为想要的数据类型比如double,如果要进行数字处理,那就乘以相应的系数。然后再将其转化为字符串类型。然后利用append和prepend将其拼接。最后将其利用串口发送出去。
void masMainWindow::on_btnINalarm_clicked()
{
QString buf = "set ilt ";
QString buf1 = "\r\n";
QString str = ui->doubleSpinBoxIN->text();
double numin = str.toDouble();
QString strin = QString::number(numin);
buf.append(strin);
buf1.prepend(buf);
const char *temp=buf1.toLocal8Bit().data();
currentPort->write(temp);
}
2.3 PushButton+SpinBox+Slider
这里要实现拉条和SpinBox的联动。这条函数实现了拉条的数值和SpinBox统一。
/**
* @brief ADC拉条
*/
void masMainWindow::on_horizontalSliderADC_valueChanged(int value)
{
ui->spinBoxADC->setValue(value);
}
这条实现了SpinBox和拉条的数值统一。
/**
* @brief ADC控件
*/
void masMainWindow::on_spinBoxADC_valueChanged(int value)
{
ui->horizontalSliderADC->setValue(value);
}
这条利用获取到的SpinBox的数值,进行数据发送:
/**
* @brief ADC输出按钮
*/
void masMainWindow::on_btnSetADC_clicked()
{
QString buf = "set dac2 ";
QString buf1 = "\r\n";
QString str = ui->spinBoxADC->text();
int numadc = str.toInt();
QString stradc = QString::number(numadc);
buf.append(stradc);
buf1.prepend(buf);
const char *temp=buf1.toLocal8Bit().data();
currentPort->write(temp);
}
3. 指示灯函数
有时候我们需要指示灯来显示状态:
这里其实就用一个laber就可以实现:
函数如下:
/***********************************指示灯控件*************************************/
// 该函数将label控件变成一个圆形指示灯,需要指定颜色color以及直径size
// color 0:grey 1:red 2:green 3:yellow
// size 单位是像素
void masMainWindow::setLED(QLabel* label, int color, int size)
{
// 将label中的文字清空
label->setText("");
// 先设置矩形大小
// 如果ui界面设置的label大小比最小宽度和高度小,矩形将被设置为最小宽度和最小高度;
// 如果ui界面设置的label大小比最小宽度和高度大,矩形将被设置为最大宽度和最大高度;
QString min_width = QString("min-width: %1px;").arg(size); // 最小宽度:size
QString min_height = QString("min-height: %1px;").arg(size); // 最小高度:size
QString max_width = QString("max-width: %1px;").arg(size); // 最小宽度:size
QString max_height = QString("max-height: %1px;").arg(size); // 最小高度:size
// 再设置边界形状及边框
QString border_radius = QString("border-radius: %1px;").arg(size/2); // 边框是圆角,半径为size/2
QString border = QString("border:1px solid black;"); // 边框为1px黑色
// 最后设置背景颜色
QString background = "background-color:";
switch (color) {
case 0:
// 灰色
background += "rgb(190,190,190)";
break;
case 1:
// 红色
background += "rgb(255,0,0)";
break;
case 2:
// 绿色
background += "rgb(0,255,0)";
break;
case 3:
// 黄色
background += "rgb(255,255,0)";
break;
default:
break;
}
const QString SheetStyle = min_width + min_height + max_width + max_height + border_radius + border + background;
label->setAlignment(Qt::AlignCenter);
label->setStyleSheet(SheetStyle);
}
我们想令其显示时就可以这样书写:第一个参数是控件,第二个颜色,第三个尺寸。
setLED(ui->label_pumpLED, 2, 20);