今天看了一点QT相关的代码,想要弄明白client application中QCanvas的derived class(那里是获取事件信息的源头)是何时被创建并注入到QT中去的。顺便了解了些QT信号和槽的知识。
note down:
1. 首先,QT signal 和slot都是QT自定义的东西,非C++所有。那么包含有这些玩意的h和cpp文件是如何编译的呢?分下面几步:
1)调用QT自家的moc编译工具对这些玩意进行解析进而生成标准c++编译器支持的代码。 (A.h/cpp) -> (A.moc.h/cpp)
2)把A.moc.h/cpp交给C++编译器进行编译。
More:
元对象编译器 moc(meta object compiler)对 C++ 文件中的类声明进行分析并产生用于初始化元对象的 C++ 代码,元对象包含全部信号和槽的名字以及指向这些函数的指针。
moc 读 C++ 源文件,如果发现有 Q_OBJECT 宏声明的类,它就会生成另外一个 C++ 源文件,这个新生成的文件中包含有该类的元对象代码。例如,假设我们有一个头文件 mysignal.h,在这个文件中包含有信号或槽的声明,那么在编译之前 moc 工具就会根据该文件自动生成一个名为 mysignal.moc.h 的 C++ 源文件并将其提交给编译器;类似地,对应于 mysignal.cpp 文件 moc 工具将自动生成一个名为 mysignal.moc.cpp 文件提交给编译器。
2. signal可以理解为event (valueChanged, clicked),slot可以理解为事件响应函数。在QT UI设计器中工作时,不需要显式的去关联比如一个menu的事件由哪个slot来响应。这里的关联是通过规则的slot函数名来做到的。比如:你在UI里加个了menu叫ActiveNew;只要你写好一个on_ActiveNew_Triggered()的slot,ActiveNew的triggered signal就自动和这个slot连接起来了。这件事情是调用QMetaObject::connectSlotsByName干的。
参考: QT 的信号与槽机制介绍