Qt:信号和槽总结(1,C++11下的信号和槽  2,第五个参数  3,阻塞 )

信号和槽是Qt特有的一种通讯方法,具有以下特点:

  1. 信号与槽的连接比较灵活,可以一对一,一对多或者是多对一
  2. 信号与槽的绑定与解除也十分的灵活,使用connect以及disconnect就可以了
  3. 信号和槽可以用来实现线程之间的通信(信号和槽的第五个参数)

目录

常规信号和槽:

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类型
  1. 当成功断开时,返回true
  2. 当断开失败时,返回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);