1.避免传递二义性
2.信号和槽传递示例
示例2.11:信号和槽的关联
//头文件m.h的内容
#ifndef M_H
#define M_H
#include<QObject>
#include <iostream>
using namespace std;
class A:public QObject{ Q_OBJECT
signals:void s(); void s(int,int); void s1(); void s2(int); };
class B:public QObject{ Q_OBJECT
public slots:
void x(){cout<<"x"<<endl;} void y(int i,int j){cout<<"y="<<i<<j<<endl;}
void z(int){cout<<"zi"<<endl;} void z1(float){cout<<"z1f"<<endl;}
public:
void z2(){ //注意,该函数未使用slots声明。
cout<<"z2"<<endl; }
private slots: //私有槽
void z3(){ cout<<"z3"<<endl; } };
#endif // M_H
//源文件m.cpp的内容
#include "m.h"
int main(int argc, char *argv[]){ A ma; B mb;
QObject::connect(&ma,SIGNAL(s()),&mb,SLOT(x())); //形式1
emit ma.s(); //输出x
QObject::connect(&ma,&A::s1,&mb,&B::x); //形式3
emit ma.s1(); //输出x
// QObject::connect(&ma,&A::s1,&mb,&B::y); //错误,槽参数的数量多余信号参数的数量
//类型转换
//关联失败,形式1不支持类型转换
//QObject::connect(&ma,SIGNAL(s2(int)),&mb,SLOT(z1(float)));
typedef int T;
//关联失败,对于形式1,类型T和int在字符串形式上并不相同。
//QObject::connect(&ma,SIGNAL(s2(T)),&mb,SLOT(z(int)));
QObject::connect(&ma,&A::s2,&mb,&B::z1); //正确,形式3支持隐式类型转换
emit ma.s2(2); //输出z1f
//槽函数与slots
//关联失败,形式1的槽必须使用slots声明。
//QObject::connect(&ma,SIGNAL(s1()),&mb,SLOT(z2()));
QObject::connect(&ma,&A::s1,&mb,&B::z2); //正确,形式3的槽不需使用slots声明。
emit ma.s1(); /*输出x,z2,注意:在之前s1和x的关联并未断开,此时信号s1同时与槽x和z2关联。*/
//访问控制符
QObject::connect(&ma,SIGNAL(s1()),&mb,SLOT(z3())); //正确,形式1的槽不受访问控制符限制。
emit ma.s1(); //输出x,z2,z3,因为此时s1与多个槽相关联。
//QObject::connect(&ma,&A::s1,&mb,&B::z3);//错误,z3是私有的,形式3会受访问控制符的限制。
//函数重载,形式2和形式4的使用见正文
return 0; }
3.信号和槽传递参数
链接: 信号槽如何传递参数(或带参数的信号槽).