惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

J
Java Code Geeks
腾讯CDC
M
MIT News - Artificial intelligence
Y
Y Combinator Blog
L
LangChain Blog
Vercel News
Vercel News
云风的 BLOG
云风的 BLOG
GbyAI
GbyAI
Stack Overflow Blog
Stack Overflow Blog
Microsoft Azure Blog
Microsoft Azure Blog
B
Blog RSS Feed
The GitHub Blog
The GitHub Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
B
Blog
P
Proofpoint News Feed
H
Hackread – Cybersecurity News, Data Breaches, AI and More
博客园_首页
Google DeepMind News
Google DeepMind News
WordPress大学
WordPress大学
aimingoo的专栏
aimingoo的专栏
小众软件
小众软件
IT之家
IT之家
A
About on SuperTechFans
H
Help Net Security

博客园 - 能巴

[SQL Server]Index/deadlock 业务学习 [LoadRunner]负载测试工具 一般函数指针和类的成员函数指针 [P4 password]Avoiding the Perforce Prompt for Password in Windows [收藏转载]2011 APP年终总结——日均160元的收入经历 [收藏转载]我所积累的20条编程经验 [收藏转载]明星软件工程师的十种特质 Importance of Side Projects [转载]最好的HTML 5编码教程和参考手册分享 . [Mobility]移动开发概览 How Browser Works [c++ 11x rvalue reference] [转载]The Biggest Changes in C++11 (and Why You Should Care) Summary of Exception Exception Cost STL算法find_if和find How to set NoStepInto for VS debugging Review: Function Pointer
QT信号和槽
能巴 · 2011-07-13 · via 博客园 - 能巴

今天看了一点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 的信号与槽机制介绍