Qt信号与槽

1.如果一个信号与多个槽相联系的话,那么,当这个信号被发射时,与之相关的槽被激活的顺序将是随机的

2.宏定义不能用在singal和slot的参数中

3.避免在槽中再次发射所接收到的信号,出现死循环

4.构造函数不能用在signals或slots声明区域内

5.信号与槽的效率是很高的,但是与真正的回调函数相比,在速度上还是有所损失,在实时系统中尽可能少用这种机制

6.函数指针不能作为信号或槽的参数

class someClass : public QObject 
{ 
    Q_OBJECT 
    [...] 
    public slots: 
       void apply(void (*applyFunction)(QList*, void*), char*); // 不合语法
};

//可以采用这种方式绕过限制
typedef void (*ApplyFunctionType)(QList*, void*); 
class someClass : public QObject 
{ 
    Q_OBJECT 
    [...] 
    public slots: 
        void apply( ApplyFunctionType, char *); 
};

7.信号与槽不能有缺省参数

8.信号与槽不能携带模版类参数

9.自己定义的类型想使用signal和slot来传递的话
原因:当一个signal被放到队列中(queued)时,它的参数(arguments)也会被一起一起放到队列中(queued起来),这就意味着参数在被传送到slot之前需要被拷贝、存储在队列中(queue)中;为了能够在队列中存储这些参数(argument),Qt需要去construct、destruct、copy这些对象,而为了让Qt知道怎样去作这些事情,参数的类型需要使用qRegisterMetaType来注册(如错误提示中的说明)

​ 步骤:(以自定义TextAndNumber类型为例)

​ 1.自定一种类型,在这个类型的顶部包含:#include

​ 2.在类型定义完成后,加入声明:Q_DECLARE_METATYPE(TextAndNumber);

​ 3.在main()函数中注册这种类型:qRegisterMetaType(“TextAndNumber”);

​ 4.如果还希望使用这种类型的引用,可同样要注册:qRegisterMetaType(“TextAndNumber&”);

10.信号与槽传递自定义结构体
​ 可以让结构体在线程之间传递
1.注册结构体

	#include <QMetaType> //没有include并不会报错
typedef struct People{
	int age;
	QString name;
}People;
Q_DECLARE_METATYPE(People);//[1]注册自定义结构体(没写这个使用不正常)

qRegisterMetaType<People>("People");
qRegisterMetaType<People>("People&");//要传递引用的话,还需要定义&(?
//connect(sender, SIGNAL(signalPeople(People)), receiver, SLOT(slotPeople(People)));//通用写法
connect(this, &myClass::sigPeople, this, &myClass::slotPeople);//[2]在使用之前注册并connect

protected slot:
	void slotPeople(const People& m_people);
signals:
	void sigPeople(const People& m_people);//[3]类里的定义

emit sigPeople(p_peo);//发送
void myClass::slotPeople(const People& m_peo)//m_peo就是发送出的p_peo
{
  //处理代码
}

2.将结构体封装成一个QVariant,注册QVariant

#include <QMetaType>
typedef struct Data{
  int id;
  QString msg;
}Data;
Q_DECLARE_METATYPE(Data);//[1]定义结构体

Data myData;
QVariant dataVar;
dataVar.setValue(myData);
emit sigAddMsg(dataVar);//[2]结构体封装为QVariant

qRegisterMetaType<People>("People");
connect(this, &myClass::sigAddMsg, this, &myClass::onAddMsg);//[3]构造函数里注册

protected slot:
	void onAddMsg(QVriant dataVar);
signals:
	void sigAddMsg(QVariant dataVar);//[4]类里的定义

void myClass::onAddMsg(QVriant dataVar)
{
  Data myData;
  mydata = dataVar.value<Data>();
}//[5]槽函数中提取为结构体数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值