QT学习教程
重点:信号和槽
连接函数: connect(信号的发送者, 发送的具体的信号, 信号的接收者, 信号的处理(槽函数));
优点:松散耦合, 信号的发送端 和 信号的接收端 本身没有关联的, 通过connect连接 将两端 耦合在一起
参数1: 信号的发送者
参数2: 发送的信号(函数的地址)
参数3: 信号的接收者
参数4: 处理的槽函数(函数地址)
注意: 信号可以连接信号
一个信号可以连接过个槽函数
多个信号可以连接同一个槽函数
信号和槽函数的参数类型必须一一匹配
信号的参数个数必须大于槽函数的参数个数,且参数类型要一一对应
自定义信号和槽
自定义信号:
写在signals下;
返回void,只需要声明,不需要实现;
可以有参数,能发生重载;
自定义槽函数:
早期Qt版本必须写在public slots下,高级版本可以写到public下或者全局下;
返回值void,需要声明,也需要实现;
可以有参数,可以发生重载;
自定义信号带参数:
函数指针->函数地址
声明Teacher作用域下的函数指针 指向函数地址
用声明的函数指针替换连接中的发送的信号的函数地址
示例:void(Teacher::*teacherSignal)(QString) = &Teacher::hungry;
自定义槽函数带参数:
函数指针->函数地址
声明Student作用域下的函数指针 指向函数地址
用声明的函数指针替换连接中的接收信号的函数地址
示例:void(Student::*studentSignal)(QString) = &Student::treat;
断开信号:
disconnect(btn, &QPushButton::clicked, widget, &QWidget::close)
QT4信号和槽连接方式:
connect(zt, SIGNAL(hungry()), st, SLOT(treat()));
优点:参数直观.
缺点:类型不做检测.
QT5兼容QT4信号槽连接写法
关于自定义信号和槽课程讲解自己的一些理解
第一点:
先进行发送者和接收者的连接,然后再去触发自定义的信号函数.否则连接不起作用.
示例:下课了,老师饿了,学生请客吃饭.
示例中的"下课了"就是先决条件,下课了执行的顺序要在信号和槽的连接之后
下课函数中要用关键字:emit 去触发自定义的信号
第二点:
自定义的信号和槽无参情况下,信号和信号的连接可以直接使用函数指针.
在有参的情况下,还是老老实实使用emit吧.
示例:
有参:
void(Teacher::*teacherSignal)(QString) = &Teacher::hungry;
void(Student::*studentSignal)(QString) = &Student::treat;
connect(zt, teacherSignal, st, studentSignal);
connect(btn, &QPushButton::clicked, this, &Widget::classIsOver); //classIsOver执行emit信号
无参:
void(Teacher::*teacherSignal)(void) = &Teacher::hungry;
void(Student::*studentSignal)(void) = &Student::treat;
connect(zt, teacherSignal, st, studentSignal);
connect(btn, &QPushButton::clicked, zt, teacherSignal); //直接进行信号连接信号
易错点:
信号的参数数量一定要大于槽参数的数量,且第一个参数类型要保持一致
拓展:
QString 转成 char*
QString -> char*
先转成QByteArray(.toUtf8)再转char*
示例:QString.toUtf8.data();
函数指针
函数指针是指向函数的指针,和普通指针相比起来所不同的是函数指针的内部存储了函数的地址而非数据的地址.
使用限制:可以实现对 参数类型\参数顺序\返回值 都相同的函数进行封装,是多态的一种实现方式
示例:
int(*Func)(int, string)
int test(int number, string name);
Func = test;
Func = &test;
类函数指针
类的静态成员采用与一般函数指针相同的调用方式,不受this指针的影响;类的非静态成员函数与一般函数指针是不兼容的.
而且不同的this指针是不一样的,因此,指向不同类的非静态成员函数的指针也是不兼容的.
指向类的非静态成员函数的指针,在声明时就需要添加类名.
示例:
类函数指针静态成员函数: typedef int (*pg)(int, int)
类函数指针非静态成员函数: typedef int (CA::*pg)(int, int)