网站建设需要多少钱文档,杨庄网站建设,淮北信息网,iframe网站后台模板信号和槽机制是Qt的核心机制#xff0c;可以让编程人员将互不相关的对象绑定在一起#xff0c;实现对象之间的通信。
声明了信号的对象#xff0c;当其状态改变时#xff0c;信号就由该对象发送出去#xff0c;而且该对象只负责发送信号#xff0c;它不知道另一端是谁在…信号和槽机制是Qt的核心机制可以让编程人员将互不相关的对象绑定在一起实现对象之间的通信。
声明了信号的对象当其状态改变时信号就由该对象发送出去而且该对象只负责发送信号它不知道另一端是谁在接收这个信号。
槽用于接收和处理信号一个槽并不知道是否有任何信号与自己相连接。
槽实际上只是普通的对象成员函数。当一个信号被发射时与其相关的槽将被立即执行就像一个正常的函数调用一样。
信号与槽机制完全独立于任何GUI事件循环。
信号
①信号signal的声明是在一个类的头文件中进行的
②Qt的signal关键字指出进入了信号声明区随后即可声明自己的信号
例如
signals:void stateChanged(int nNewVal); //定义信号
这里signals是Qt的关键字而非C的关键字。
信号函数stateChanged定义了信号stateChanged这个信号带有参数nNewVal
信号函数语法受到以下几点约束
①函数返回值是void类型因为触发信号函数的目的是执行与其绑定的槽函数无须信号函数返回任何值。
②开发人员只能声明而不能实现信号函数。
③信号函数被moc自动设置为protected因而只有包含一个信号函数的那个类及其派生类才能使用该信号函数。
④信号函数的参数个数、类型由开发人员自行设定。这些参数的职责是封装类的状态信息并将这些信息传递给槽函数。
⑤只有QObject及其派生类才可以声明信号函数
槽
①槽函数和普通的C成员函数一样可以被正常调用。
②槽唯一的特殊性就是很多信息可以与其相关联。
③当与其关联的信号被发送时这个槽就会被调用。
④槽可以有参数但槽的参数不能有默认值。关键字slots表名进入了槽函数声明区。
槽的声明也是在头文件中进行的例如
public slots: //此语句说明后面就是槽函数void Function(int nNewVal){qDebug() new Values nNewVal; //显示变量 }
槽函数的返回值是void类型因为信号和槽机制是单向的信号被发送后与其绑定的槽函数会被执行但不要求槽函数返回任何执行结果。和信号函数一样只有QObject及其派生类才可以定义槽函数。
既然槽函数是普通的成员函数因此与其他的函数一样它们也有存取权限publicprotectedprivate。也就是说人们能控制其他类能够以怎样的方式调用一个函数。
关联信号与槽
通过调用QObject::connect函数可以绑定一个信号函数和一个槽函数该函数最常用的格式如下
connect(sender,SIGNAL(signal_func()),receiver,SLOT(slot_func()))
其中sender及receiver都是指向QObject或其子类对象的指针
前者指向发送信号的对象后者指向处理信号的对象两者分别被称为“发送者”及“接收者”。
signal_func以及slot_func分别是这两个对象中定义的信号函数和槽函数。
当指定信号signal时一般使用Qt的宏SIGNAL指定槽函数时必须使用宏SLOT。
一个信号函数可以和多个槽函数绑定。
多个信号函数可以和一个槽函数绑定。 使用信号和槽机制时应该注意以下几点
①信号和槽机制与普通函数调用一样如果使用不当在程序执行时也有可能产生死循环
②如果一个信号与多个槽相联系那么当这个信号被发送时与之相关的槽被激活的顺序将是随机的
③宏定义不能用在信号和槽的参数中。
④信号和槽的参数个数与类型必须一致
信号和槽举例 再次建立头文件 exampleA.h修改其内容为 #ifndef EXAMPLEA_H
#define EXAMPLEA_H
#includeQCoreApplication
class CExampleA:public QObject
{Q_OBJECTint m_Value;// 定义私有成员
public:CExampleA(){m_Value 0;}void SetValue(int nNewVal){if (m_Value nNewVal){ return ; }m_Value nNewVal;// emit函数用来激活信号函数发送信号emit stateChanged(m_Value);}
signals: // 定义信号函数带参数void stateChanged(int nNewVal);
};
#endif // EXAMPLEA_HexampleB.h修改其内容为 #ifndef EXAMPLEB_H
#define EXAMPLEB_H
#includeQDebug //包含调式类
#includeQCoreApplication
class CExampleB:public QObject
{Q_OBJECT
public:CExampleB(){}
public slots: //定义槽函数void Function(int nNewVal) //nNewVal为100{qDebug() new Values nNewVal;}
};#endif // EXAMPLEB_H再次打开新建对话框添加主函数文件 main.cpp中修改为 #includeexampleA.h
#includeexampleB.h
int main()
{CExampleA a; //创建CExampleA类的对象a调用构造函数m_Value 0CExampleB b; //创建CExampleB类的对象b//连接信号和槽connect函数要求发送对象和接收对象均为指针a,b是对象名a,b是发送对象的指针和接收对象的指针。QObject::connect(a,SIGNAL(stateChanged(int)),b,SLOT(Function(int)));a.SetValue(100); //调用a对象的公有函数return 0;
}运行 简单实现了信号与槽的功能