在线文档地址
https://doc.qt.io/qt-5/signalsandslots.html
当对象的内部状态发生了某种对对象的客户端或所有者感兴趣的方式变化时,信号由对象发出。信号是公共访问函数,可以从任何地方发出,但我们建议仅从定义信号及其子类的类发出信号。
当连接到插槽的信号发出时,将调用插槽。插槽是C++正常,可以正常调用;他们唯一的特色是信号可以连接到他们。
我对信号与信号槽的理解:信号是发送者,信号槽是接收者,就跟凸凹这两个字一样,信号是凸,信号槽是凹,他们一个发送,一个负责接收,形象的表达了两者之间的关系。
也就是槽函数是信号发生后要做的,因此槽函数通常由我们自己编写功能,就是信号产生后我们想干什么。
这里要提前将该函数定义为槽函数。定义的方式如下所示,通常在头文件里,窗口类里面定义,不懂C++的只管照葫芦画瓢就行了。
private slots:
void recv_data(void); //接收数据
void on_pushButton_1_clicked(); //检测串口
void on_pushButton_2_clicked(); //打开串口
void on_pushButton_3_clicked(); //清除接收发
void on_pushButton_4_clicked(); //清除发送
void on_pushButton_5_clicked(); //发送
void on_textEdit_2_textChanged();//发送文本框文本内容改变事件
这样我们在C++文件里编写该函数的实体就可以了,系统就会将它们作为槽函数对待。
通过connect函数将信号与槽函数连接起来,如下所示
connect(serial,SIGNAL(readyRead()),this,SLOT(recv_data()));
该函数有4个参数,第一个 信号的产生者:串口;第二个:产生的信号;第三个接受者,this表示当前对象的地址,然后就是触发的槽函数。
connect(ui->textEdit_2,SIGNAL(textChanged()),this,SLOT(on_textEdit_2_textChanged()));
这个同样,是文本框2产生一个内容改变的信号,将会引起文本编辑框2文本改变执行的函数。
还有一些内置的槽函数,比如按键事件,按下,松手,等这种UI控件产生的事件,系统有一套管理方式,不需要自己编写链接函数。
在你需要设置槽函数的控件上单击右键,弹出以上这种设置菜单,选择你需要设置的信号类型,然后会自动给你创建一个槽函数,这种不需要你自己编写connect
你只需要在自动生成的函数里完成你要的功能就行了。比如清楚文本框的槽函数,我们也注意到,生成的函数名字命名规则,后面是信号的类型,前面是一个on开头,中间是控件的名字
//清除发送文本框内容
void MainWindow::on_pushButton_4_clicked()
{
ui->textEdit_2->clear();
}
//清除接收文本框内容
void MainWindow::on_pushButton_3_clicked()
{
ui->textEdit_1->clear();
}
怎么样,赶紧自己动手练习一下这两种槽函数的编写方式吧。
该贴中用到的代码来自我的串口助手项目
https://bbs.21ic.com/icview-3053978-1-1.html
|