Qt:信号和槽总结(1,C++11下的信号和槽 2,第五个参数 3,阻塞 )
信号和槽是Qt特有的一种通讯方法,具有以下特点:
- 信号与槽的连接比较灵活,可以一对一,一对多或者是多对一
- 信号与槽的绑定与解除也十分的灵活,使用connect以及disconnect就可以了
- 信号和槽可以用来实现线程之间的通信(信号和槽的第五个参数)
目录
常规信号和槽:
C++11下的信号和槽:
信号和槽的第五个参数:
阻塞:
常规信号和槽:
connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)
信号和槽的标准形式如上:
//标准信号和槽
//const QObject *sender:信号发出者
//const char *signal:发出信号的名称
//const QObject *receiver:信号接受者
//const char *method:信号接收函数(槽函数)的名称
//Qt::ConnectionType type = Qt::AutoConnection:连接方式,一般默认为自动,不需要输入,Qt会自动判断,属于第五个参数
举例:
connect(begin,&QPushButton::clicked,this,on_connect_clicked);
begin为信号的发出者,信号为clicked,接受者是connect所在的类,执行内容为 on_connect_clicked
C++11下的信号和槽:
此形式是C++11中更新的内容:
形式如下:
connect(const QObject *sender,const char *signal,
[=]()
{
.............
//相应的数据操作
............
}
)
举例:
connect(ui->example,&QAction::triggered,
[=]()
{
qDebug()<<"example is triggered";
}
)
此方法省去了信号的接受者和接收后的槽函数,显然,信号的接受者为connect所在的类,执行内容为{}中的内容。
信号和槽的第五个参数:
信号和槽可以进行跨线程通讯,一般不需要写第五个参数(第五个参数,connection Type)
因为信号和槽默认第五个参数是Qt::AutoConnection。
connect会自动判断信号发送者,接受者,槽函数的位置,根据位置来判断使用队列还是直接方式
连接方式具体分为以下几种:
- 如果是单线程通讯,使用直接方式
(Qt::DirectConnection)直接:槽函数和所在线程和发送者一样。
如果接收者和发送者不在一个线程,则自动使用Qt::QueuedConnection类型
- 如果是多线程之间通讯,使用队列方式
(Qt::QueuedConnection)队列:槽函数所在的线程和接受者一样
一般默认是自动方式,Qt会自动进行判断,如果是多线程,会进行多线程队列的连接方式,如果是单线程,会采用直接的连接 方式
阻塞:
在必要的时候,需要断开信号和槽,此时使用阻塞( disconnect() )即可
其原型如下:
bool QObject::disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
- 从原型中可以看见,返回值为bool类型
- 当成功断开时,返回true
- 当断开失败时,返回false
disconnect()有三种使用方法:
1.(一刀切模式)断开所有和myObject对象的信号连接的槽函数
disconnect(myObject, 0, 0, 0);
等价于
myObject->disconnect();
2.断开myObject对象中mySignal()信号与其他槽函数的连接
disconnect(myObject, SIGNAL(mySignal()), 0, 0);
等价于
myObject->disconnect(SIGNAL(mySignal()));
3.断开myObject对象与myReceiver对象间的连接,两个类之间无法进行通讯工作
disconnect(myObject, 0, myReceiver, 0);
等价于
myObject->disconnect(myReceiver);