1.3 初步了解信号和槽
在Qt中,如何响应动作。这会用到Qt的信号和槽机制。
我的理解:它和Win32程序的消息响应机制差不多吧。
信号,简单理解就是:当我们点击一个按钮时,这个按钮自身就会产生一个叫作"单击"的信息,这个信息说明了刚刚我们点击了这一个按钮。产生的这个信息就相当于自己发射了一个信号,表明一个用户动作已经发生了或者是一个状态已经改变了。这就是信号(signal)。
槽,可以理解为:当这个按钮发射了这个信号之后,假如有一个"监听员"发现了这个信号,它会马上做出响应,做相应的动作。这个动作一般就是指执行一个或多个函数。这些就是槽(slot)。
要使得槽能够响应指定的信号,就需要把信号和指定的槽连接起来。连接之后,只要出现了这个信号,槽就会自动执行。
接下来看一下以下代码:
第7行:创建一个QPushButton对象,头文件<QPushButton>
用到的函数:QPushButton::QPushButton ( const QString & text, QWidget * parent = 0 )
函数的说明:构造一个文本为text的按钮,parent是它的父窗口,默认为0。
第9行:将信号(clicked())和槽(quit())连接。
用到的函数:bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionTypetype = Qt::AutoConnection )
函数的说明:创建一个指定类型(type)的连接,指定发送方对象和方法,和接收方对象和方法。如果连接成功,返回true,否则将返回false。
参数中,type已经有默认值,现在来说不需要自己指定。
sender是发射信号的对象,signal是这个对象发射的具体的信号,需要使用SIGNAL()宏。
receiver是接收信号的对象,method是槽,也就是响应的函数,需要使用SLOT()宏。
SIGNAL()和SLOT()是Qt中定义的宏,这两个宏会把它们的参数转换成相应的字符串。
两个宏的参数都是不带参数名的函数名(参数名是指函数参数中的变量名,不是指参数类型,这其实也可以说成这两个宏的参数就是一个比较类似函数指针的类型的东西吧?只不过没有返回值和返回值后面跟着的(*)这个东西而已)。
sender与receiver对象各自拥自己的发射信号和槽,例如例子中QPushButton有clicked()信号和QApplication有quit()槽。
QPushButton的信号是通过继承而来的,它继承自QAbstractButton类,这个类本身拥有以下信号:
分别有1个信号继承自QWidget、QObject。主要的还是上面4个信号。
看看就好~嘿嘿,自己也可以尝试。
QApplication的有以下槽:
在例子中,使用了一个quit(),这个槽是QApplication继承自QCoreApplication类得到的。
在QCoreApplication中,定义了quit()这个槽。
例子中,clicked()信号表明当用户单击了按钮button时会发射的信号,然后执行app对象中的槽quit(),从而退出这个程序。
就暂时到这里吧,到这里,也算是初步了解了什么是信号和槽。这个是Qt编程的基础。
另外,Qt帮助文档也是一个不错的东西。
如果是使用Qt Creator,想要知道某一个Qt类的详细信息的话,单击一下类名,按F1就可以转到帮助文档了。
在我看来,信号和槽进制比较好理解,简单地想成是一个发送方和接收方就行了,当点击按钮时,发送方发送一个clicked()的消息给接收方,接收方接收消息之后开始做自己的动作。
当然了,毕竟只是自己的总结笔记,有些地方是自己理解来写的,如果理解是错误的请见谅~