Qt入门之信号槽概念--qt对象通信机制

标签:qt信号槽
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://hongbin0720.blog.51cto.com/3305400/1230096

   信号和槽是qt用于对象之间通信的核心机制。其目的类似于当一个动作发生的时候,需要对这个动作做出相应的处理,很多时候首选回调函数,通过回调函数完成对此动作的操作。但是有一个小小的问题,如果对一个庞杂的系统,这种回调函数的维护是相当的麻烦和危险的,所以qt为了很好的避免实现了自己的一套通信机制,即信号和槽。

   1、信号:是可以看作是一个请求或者一个动作的标志。如果一个对象在达到一个状态或者需要一个请求等操作的时候,其会触发这个信号。qt实现触发请求,使用emit命令。此是qt固有的。

   触发的参数是对象声明的信号,即signals下声明的函数类型,其没有实现。因为其目的只是作为一个标志,然后将对应的函数形式及参数传递出去。

   注意:signals:是qt自由的关键字,其不需要具体的实现。

   2、槽:其实就是一个处理函数,是在对象中声明为slots:之下的函数及其实现,其类似于回调函数一样。槽是一个对象对他感兴趣的对象的某个时间做出处理。

   需要注意的是,槽函数也可以当作一个普通的函数进行调用。同时槽函数函数的声明应该和其需要对接的信号一致。

   其信号槽工作的过程是:当一个对象通过emit发射一个信号的时候,则和其连接的对象的槽函数进行处理,等槽函数处理完成之后emit退出并执行接下来的内容。


    那么信号和槽是怎么连接呢?则是通过qt最根本的元对象QObject的connect进行连接。


   其有两个函数,分别完成对象的连接和断开,且都是静态函数,即:


bool QObject::connect ( const QObject * sender, const char * signal, const char * method, Qt::ConnectionTypetype = Qt::AutoConnection ) const

将sender对象的信号连接到此对象的槽函数中

bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionTypetype = Qt::AutoConnection ) [static]

将sender对象的信号连接到receiver的槽函数中

bool QObject::disconnect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method )

断开sender的信号与receiver的槽

bool QObject::disconnect ( const char * signal = 0, const QObject * receiver = 0, const char * method = 0 ) 断开信号与reciver对象的槽的连接。如果一个对象销毁也会断开

bool QObject::disconnect ( const QObject * receiver, const char * method = 0 )

断开所有与receiver的槽连接的信号,对象被删除时自动执行断开


注释:sender是发出信号的对象,其类型选QObject,可以使用所有的控件,因为其实所有Qt控件的基类

signal是以一个信号函数,经过SIGNAL宏处理为对应的字符

receiver是接收信号的对象

method是接收对象对应的处理槽函数,通过SLOT处理为字符串


下面看一个简单的例子:

#include<QApplcation>

#include <QPushButton>

int main(int argc,char *argv[])

{

   QApplication app(argc,argv);

   QPushButton btn;

   btn.setText("Quit");

   QObject::connect(&btn,SIGNAL(clicked()),&app,SLOT(quit()));//连接信号槽,这样当点击btn时出发clicked信号被app对象接收并用quit槽处理

//QObject::disconnect(&btn,SIGNAL(clicked()),&app,SLOT(quit()));如果断开,则app不会执行quit的槽的

   btn.show();

   return app.exec();

}


Button主要看作触发一个动作,其被点击的时候会发送一个click的功能,此时会被app对象接收,并相应其quit槽进行处理。此程序的目的是发射一个退出指令,qt程序退出。


QPushButton是qt的一个Button,至于详细内容可查看后期详细讲解。

关于qt信号槽的实现原理在后续文章会进行专题研究。

为了便于理解值得一提的是,qt的信号槽需要moc工具协助完成,其会对signals下的信号及slots下的槽函数进行一个等级管理,在连接的时候通过SIGNAL及SLOT槽完成对应的信号槽的对接,以实现准确调用。


本文出自 “zhouhb” 博客,请务必保留此出处http://hongbin0720.blog.51cto.com/3305400/1230096

原文地址:https://www.cnblogs.com/raiven2008/p/4260887.html