Qt 学习(一)信号与槽机制

最近在利用qt平台开发一个项目,记录一下自己的qt学习记录

首先聚焦一下qt的核心机制之一:信号槽机制

  • 信号(signals)

信号是定义在类里面的一个函数,必须在函数前加入关键字signals,其实也可以理解为宏,这个signals涉及到qt的另一个核心机制(模板元编程),想必度过effective C++的同学对该技术并不陌生,扯远了,继续说信号,当拥有信号的类声明了一个对象时,该对象便有了发送该信号的能力,当然,该类的派生类也具有该能力。定义信号函数时,返回值必须是void,可以有形参,但是没有成员限定访问符的限定,我认为它是public,但是好像是真没有,定义一个signals给大家看一下:

signals:
   void selectionChange(int index);
  • 槽(slots)

槽函数就有意思了,它是信号的响应函数,与信号函数不同,它有成员限定访问符,可以是public ,protectde和private,我最近阅读的文档来看,大部分都只采用public和private,当用public限定槽函数,其它类的信号可以connect它,自己就更不用说啦,但是private的时候,就只能自己类的对象来关联了,但是protected就有点,嗯,怎么说,继承和派生时候贡献挺大的,但是在这不受待见,可能是我理解还不够,好了写个简单的槽来看一下

public slots:
   void setNewNum(int index);  
  • 连接(connect)

连接有多重写法,主要体现在信号函数和槽函数加入的方式,我最喜欢原始的那种,即第一种

QObject::connect(&m_signal,SIGNAL(signals()),&m_slot,SLOT(slot()));

注意这里connect里面传入的都是指针。

第二种:

QObject::connect(&m_signal,&QCSignal::signals,&m_slot,&QCSignal::slot)

其实,这种不好,因为当槽函数有重载的时候,不注意是会报错的,有人提到用static_cast(expression)强制类型转换来做,说实话,这会把事情搞复杂了,小程序可以用,大程序一定要摸清楚这个c++11的特性之后在用。

第三种你也不会喜欢的,因为它只是把static_cast(expression)封装了一下:

QObject::connect(&m_signal,QOverload::of(&QCSignalClass::signal_fun_with_param),&m_signal,QOverload::of(&QCSignalClass::receive_with_param));

代码下载地址:https://github.com/Yanhongzhou1994/Qt

不积跬步,无以至千里,同行一起加油啊

你可能感兴趣的:(qt)