前言:
编写了一个QT上位机连接串口的模块,部分代码复用了师兄的程序,界面如下。
下位机为STM32单片机,自己编写了串口接收程序的下位机。
QT上位机界面
2. QT中signal和slot的机制
QT中的slot(槽)可以理解为一个与界面连接的函数,可以在里面定义各种操作。
而signal(信号)则不能定义操作,只能定义connect(连接);该connect的作用是将界面操作连接到slot(高版本QT可以是各种其他函数),相当于一个触发。
以常用的click槽函数void on_START_button_clicked()为例:
这个槽函数可以通过QT一键生成,本质上就是一个signal(clicked)加slot(函数里的操作)。其他槽函数如on_spin_TestNumber_valueChanged() 之类的同理。
3. connect的作用
connect是连接signal和slot 的命令。槽函数定义void on_START_button_clicked() 相当于将click信号和该slot函数里的操作进行了connect。
4. 重复connect的bug
上位机的 Initialize和start 按键的槽函数里会调用一次串口发送命令,被调用函数如下:
void CircumScanning::writeData(const QByteArray &data)
{
seed_serial->write(data);
console->putData(data);
}
但是每次点击 Initialize 或者 start时,都会重复发送两次。
5. bug原因与解决
复用的代码里定义了这么一个函数
void CircumScanning::initializeSignAndSlot()
{
// duplicated connection !!!
connect(ui->START_button, &QPushButton::clicked, this, &CircumScanning::on_START_button_clicked);
connect(ui->Initialize_button, &QPushButton::clicked, this, &CircumScanning::on_Initialize_button_clicked);
}
这里定义了一个connect函数,这个函数实际上对start 和initialize两个按键的signal进行了重复定义!!
void on_START_button_clicked()作为QT自带的标准按键触发函数,其实已经执行了一次connect命令。
故删除这个函数里重复的connect命令,仅保留void on_START_button_clicked()函数。
bug 消除,一次点击仅发送一次信号。