微型技术博客004-深入探究connect函数
2017-06-10 01:12
351 查看
简介:
信号槽机制与Windows下消息机制类似,消息机制是基于回调函数,Qt中用信号与槽来代替函数指针,使程序更安全简洁。
信号和槽机制是 Qt 的核心机制,可以让编程人员将互不相关的对象绑定在一起,实现对象之间的通信。
信号
当对象改变其状态时,信号就由该对象发射 (emit) 出去,而且对象只负责发送信号,它不知道另一端是谁在接收这个信号。这样就做到了真正的信息封装,能确保对象被当作一个真正的软件组件来使用。
槽
用于接收信号,而且槽只是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。而且对象并不了解具体的通信机制。
槽函数(Slots)
槽和普通的C++成员函数几乎是一样的(可以是虚函数,可以被重载,可以是public slots、protected slots、private slots,可以被其他C++成员函数直接调用;唯一不同的是:槽还可以和信号连接在一起,在这种情况下,信号被发射时,会自动调用这个槽。)槽不需要信号传过来的参数时,可以不要参数;但槽一旦要参数,其参数个数,类型,顺序必须要和对应的信号保持一致。另外,槽的参数不能有缺省值。
class receiver : public QObject
{
Q_OBJECT
public slots:
//带有参数的槽函数,需和绑定的信号的参数保持一致
void recv(int);
};
// ------------ Receiver.cpp -----------
void receiver :: recv(int n)
{
qDebug()<<"recv number: "<<n<<endl;
}
关联信号和槽(connect)
可以使用QObject类的静态成员函数connect来建立信号的槽的关联
注:在connect函数中信号函数和槽函数若有参数,只能写出参数类型,而不能也将变量名写出;否则,连接会失败!
一个信号可以连接多个槽
当信号发射时,会以不确定的顺序一个接一个的调用各个槽。
多个信号可以连接同一个槽
即无论是哪一个信号被发射,都会调用这个槽。
信号直接可以相互连接
发射第一个信号时,也会发射第二个信号。
断开信号和槽(disconnect)
当信号和槽没有必要继续保持连接时,可以通过调用disconnect来断开它们。
有三种情况必须使用 disconnect() 函数:
(1)断开与某个对象相关联的任何对象。
disconnect(sender, 0, 0, 0) ;
//或者
sender->disconnect();
(2)断开与某个特定信号的任何关联。
disconnect(sender, SIGNAL(signal()), 0, 0);
//或者
sender->disconnect(SIGNAL(signal()));
(3)断开两个对象之间的关联。
disconnect(sender, 0, receiver, 0);
//或者
sender->disconnect(receiver);
应注意的问题
信号与槽机制与普通函数的调用一样,如果使用不当的话,在程序执行时也有可能产生死循环。因此,在定义槽函数时一定要注意避免间接形成无限循环,即在槽中再次发射所接收到的同样信号。例如 , 在前面给出的例子中如果在 mySlot() 槽函数中加上语句 emit mySignal() 即可形成死循环。
如果一个信号与多个槽相联系的话,那么,当这个信号被发射时,与之相关的槽被激活的顺序将是随机的。
宏定义不能用在 signal 和 slot 的参数中。
信号和槽的参数个数与类型必须一致。
信号槽机制与Windows下消息机制类似,消息机制是基于回调函数,Qt中用信号与槽来代替函数指针,使程序更安全简洁。
信号和槽机制是 Qt 的核心机制,可以让编程人员将互不相关的对象绑定在一起,实现对象之间的通信。
信号
当对象改变其状态时,信号就由该对象发射 (emit) 出去,而且对象只负责发送信号,它不知道另一端是谁在接收这个信号。这样就做到了真正的信息封装,能确保对象被当作一个真正的软件组件来使用。
槽
用于接收信号,而且槽只是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。而且对象并不了解具体的通信机制。
槽函数(Slots)
槽和普通的C++成员函数几乎是一样的(可以是虚函数,可以被重载,可以是public slots、protected slots、private slots,可以被其他C++成员函数直接调用;唯一不同的是:槽还可以和信号连接在一起,在这种情况下,信号被发射时,会自动调用这个槽。)槽不需要信号传过来的参数时,可以不要参数;但槽一旦要参数,其参数个数,类型,顺序必须要和对应的信号保持一致。另外,槽的参数不能有缺省值。
class receiver : public QObject
{
Q_OBJECT
public slots:
//带有参数的槽函数,需和绑定的信号的参数保持一致
void recv(int);
};
// ------------ Receiver.cpp -----------
void receiver :: recv(int n)
{
qDebug()<<"recv number: "<<n<<endl;
}
关联信号和槽(connect)
可以使用QObject类的静态成员函数connect来建立信号的槽的关联
bool QObject::connect (const QObject * sender, const char * signal, const QObject * receiver, const char * slot) [static]具体的调用为:connect(sender, SIGNAL(signal), receiver, SLOT(slot)); 其中sender和receiver为QObject类对象的指针; SIGNAL宏和SLOT宏将信号的槽转换成字符串。
sender s; receiver r; QObject::connect(&s, SIGNAL(send(int)), &r, SLOT(recv(int)));
注:在connect函数中信号函数和槽函数若有参数,只能写出参数类型,而不能也将变量名写出;否则,连接会失败!
一个信号可以连接多个槽
当信号发射时,会以不确定的顺序一个接一个的调用各个槽。
多个信号可以连接同一个槽
即无论是哪一个信号被发射,都会调用这个槽。
信号直接可以相互连接
发射第一个信号时,也会发射第二个信号。
断开信号和槽(disconnect)
当信号和槽没有必要继续保持连接时,可以通过调用disconnect来断开它们。
bool QObject::disconnect (const QObject * sender, const char * signal, const Object * receiver, const char * slot) [static]
有三种情况必须使用 disconnect() 函数:
(1)断开与某个对象相关联的任何对象。
disconnect(sender, 0, 0, 0) ;
//或者
sender->disconnect();
(2)断开与某个特定信号的任何关联。
disconnect(sender, SIGNAL(signal()), 0, 0);
//或者
sender->disconnect(SIGNAL(signal()));
(3)断开两个对象之间的关联。
disconnect(sender, 0, receiver, 0);
//或者
sender->disconnect(receiver);
应注意的问题
信号与槽机制与普通函数的调用一样,如果使用不当的话,在程序执行时也有可能产生死循环。因此,在定义槽函数时一定要注意避免间接形成无限循环,即在槽中再次发射所接收到的同样信号。例如 , 在前面给出的例子中如果在 mySlot() 槽函数中加上语句 emit mySignal() 即可形成死循环。
如果一个信号与多个槽相联系的话,那么,当这个信号被发射时,与之相关的槽被激活的顺序将是随机的。
宏定义不能用在 signal 和 slot 的参数中。
信号和槽的参数个数与类型必须一致。
相关文章推荐
- 微型技术博客——connect函数
- 微型技术博客-探究connect()函数。
- 深入探究EJB应用技术的体系结构2
- 深入探究SSD技术内幕
- 深入探究connect函数
- 深入探究EJB应用技术的体系结构
- 微型技术博客之匿名内部类
- 微型技术博客-SWing界面跳转。
- IT技术博客网站深入分析
- 深入探究connect函数
- 微型技术博客之静态类
- 微型技术博客002-Java多线程
- 深入探究EJB应用技术的体系结构3
- 深入探究fork函数写时拷贝技术的实现
- 深入探究connect函数
- 微型技术博客001-typedef和宏
- 深入探究Connect函数(知识点整合)
- 深入探究EJB应用技术的体系结构1
- 页面静态化技术深入探究
- 深入探究connect函数