目录
1.基本知识点
2.信号机制
3.槽机制
4.元对象工具
5.信号和槽机制原理
(1)信号和槽机制
(2)信号和槽函数的关联
(3)信号和槽的断开
(4)信号和槽的优点
(5)实例过程
Linux下的QT安装及初步使用过程(一)
1.基本知识点
- 信号和槽机制是QT的核心机制。
- 信号和槽是一种高级接口,应用于对象之间的通信;
- 信号和槽是QT自定义的一种通信机制,独立于标准的C/C++语言,要正确处理信号和槽,必须借助一个为moc的QT工具,是一个C++预处理程序,为高层次的事件处理自动生成需要的附加代码。
2.信号机制
- 当某个信号对其客户或所有者发生的内部状态发生改变,信号被一个对象发射。
- 只有定义这个信号的类以及派生类能够发射这个信号。
- 当一个信号被发射时,与其相关联的槽将被立即执行,就像一个正常的函数调用一样。
- 信号和槽机制完全独立于任何GUI事件循环。
- 只有当所有的槽返回以后发射函数才返回。
- 如果存在多个槽和某个信号相关联,当这个信号被发射的时候,这些槽将会一个接一个的执行,但是它们的执行顺序是随机的,不确定的,不能人为的指定哪个先执行,哪个后执行。
信号的声明是在头文件当中:例如以下的是三个信号:
signals(关键字):
void mySignal();
void mySignal(int x);
void mySignal(int x,int y);
提示:其中的void表示不要从信号返回什么信息(是在头文件中声明,而不是在.cpp文件中)。
3.槽机制
- 槽是普通的C++函数成员,可以被正常调用;
- 很多信号可以与之相关联;
- 当其关联的信号发被发射时,这个槽函数就会被调用;
- 槽函数可以有参数,但是其参数不能缺省;
- 槽函数与其他函数一样,有存取权限;该权限决定了谁能够与之相关联;
槽函数的三种类型:
- public slots:意味着任何对象成员都可以将信号与之相连。
- private slots:意味着只有类自己可以将信号与之相关联,适用于非常紧密的类。
- protected slots:意味着当前类及其子类可以将信号与之连接。
声明格式:
public slots:
void mySlot();
void mySlot(int x);
void mySlot(int x,int y);
4.元对象工具
- 元对象编译器对C++文件中的类声明进行分析并产生用于初始化元对象的C++代码;
- 元对象包含全部信号和槽的名字以及指向这些函数的指针。
- 当使用moc读取C++源文件时,如果发现有Q_OBJECT宏声明的类,就会生成另一个C++源文件,新生成的文件中包含该类的元对象代码。
- 比如有一个头文件mysignal.h,那么moc工具就会根据该文件自动生成一个名为“mysignal.moc.h”的C++源文件并将其提交给编译器。
- 元对象代码是signal/slot机制所必须的;
- 使用moc产生的C++源文件必须与类实现一起进行编译和连接,或者使用#include语句将其包含到类的源文件中。
- moc并不扩展#include或者#define宏定义,只是简单地跳过所遇到的任何预处理指令。
5.信号和槽机制原理
(1)信号和槽机制
- 信号和槽机制取代了凌乱的函数指针,并且信号和槽函数可以携带任意数量和类型的参数。
- 从QObject或其子类派生的类都能够包含信息和槽。
- 当对象改变其状态的时候,信号就由该对象发射(emit)出去。
- 信号和槽关联关系的模式:
- 一个信号和一个槽关联;
- 一个信号和多个槽关联;
- 多个信号和多个槽关联;
(2)信号和槽函数的关联
- 当一个特定的事件发生时,一个信号被发射;
- 槽是一个可以被调用的处理特定信号的函数;
- 函数的定义如下:
- bool QObject::connect(const QObject*sender,const char*signal,const QObject*receiver,const char*member)[static]
- 其中:connect的作用就是将发射者sender对象中的信号signal与接收者receiver中的member槽函数联系起来。如果发射者和接收者是同一个对象的话,接收者的参数可以省略。
- 例如:将标签对象label和滚动条scroll,并且将valueChanage()信号与标签对象的setNum()相关联,携带了一个整形的参数,用于显示滚动条所处的位置的值。
- QLabel*label=new QLabel;
- QScrollBar*scroll=new QScrollBar;
- QObject:connect(scroll,SIGNAL(valueChanage(int)),label,SLOT(setNum(int)));
(3)信号和槽的断开
bool QObject::disconnect(const QObject*sender,const char*signal,const QObject*receiver,const char*member)[static]
- 断开与某个对象相关联的任何对象:
- 方法一:disconnect(myObject,0,0,0);
- 方法二:myObject->disconnect()
- 断开与某个特定信号的任何关联:
- 方法一:disconnect(myObject,SIGNAL(mySignal()),0,0)
- 方法二:myObject->disconnect(SIGNAL(mySignal))
- 断开两个对象的关联
- 方法一:disconnect(myObject,0,myreceiver,0)
- 方法二:myObject->disconnect(myreceiver)
其中0表示一个通配符,表示任何信号,任何接收对象和接收对象中的任何槽函数,但是发送者不能为0,其他参数可以。
(4)信号和槽的优点
- 信号和槽机制是类型安全的;
- 信号和槽宽松地联系在一起。
(5)实例过程
第一个文件:mysigSlot.h头文件
第二文件: mysigSlot.cpp
第三个文件:主函数文件
![]()
提示:如果出现以下报错,则需要对目录进行授权,然后进行root用户下金吃那个程序的编译。
第一步:生成工程文件demo01.pro
第二步:生成Makefile文件
第三步:将demo01.pro工程文件中添加一点内容,这是由于版本问题导致的
第四步:生成可执行文件
第五:运行结果