QT中的信号槽

只有继承了QObject类的类,才具备信号槽的能力。因此,为了使用信号槽,必须继承QObject函数

凡是QObject类(无论是直接子类仍是间接子类),都应该在第一行代码写上Q_OBJECT。 无论是否是使用信号槽,都应该添加这个宏。工具

这个宏的展开将为咱们的类提供信号槽机制、国际化机制以及 Qt 提供的不基于 C++ RTTI 的反射能力。所以,若是你以为你的类不须要使用信号槽,就不添加这个宏,就是错误的。其它不少操做都会依赖于这个宏。学习

这个宏将由 moc作特殊处理,不单单是宏展开这么简单。moc 会读取标记了 Q_OBJECT 的头文件,生成以 moc_ 为前缀的文件,好比 newspaper.h 将生成 moc_newspaper.cpp。你能够到构建目录查看这个文件,看看到底增长了什么内容。spa

注意,因为 moc 只处理头文件中的标记了Q_OBJECT的类声明,不会处理 cpp 文件中的相似声明。所以,若是咱们的NewspaperReader类位于 main.cpp 中,是没法获得 moc 的处理的。解决方法是,咱们手动调用 moc 工具处理 main.cpp,而且将 main.cpp 中的#include "newspaper.h"改成#include "moc_newspaper.h"就能够了。不过,这是至关繁琐的步骤,为了不这样修改,咱们仍是将其放在头文件中。许多初学者会遇到莫名其妙的错误,一加上Q_OBJECT就出错,很大一部分是由于没有注意到这个宏应该放在头文件中。code

  • 发送者和接收者都须要是QObject的子类(固然,槽函数是全局函数、Lambda 表达式等无需接收者的时候除外);
  • 使用 signals 标记信号函数,信号是一个函数声明,返回 void,不须要实现函数代码;
  • 槽函数是普通的成员函数,做为成员函数,会受到 public、private、protected 的影响;
  • 使用 emit 在恰当的位置发送信号;
  • 使用QObject::connect()函数链接信号和槽。

【Qt 学习之路 2(5):自定义信号槽】继承

相关文章
相关标签/搜索