moc的功能数一数
1、处理Q_OBJECT宏和signals/slots关键字,生成信号和槽的底层代码
2、处理Q_PROPERTY()和Q_ENUM()生成property系统代码
3、处理Q_FLAGS()和Q_CLASSINFO()生成额外的类meta信息
4、不需要moc处理的代码可以用预定义的宏括起来,如下:
#ifndef Q_MOC_RUN
…
#endif
moc的限制数一数(太多了,眼花缭乱)
1、模板类不能使用信号/槽机制
2、moc不扩展宏,所以信号和槽的定义不能使用宏, 包括connect的时候也不能用宏做信号和槽的名字以及参数
3、从多个类派生时,QObject派生类必须放在第一个, 因为moc是这么认为的…(比较流氓) 这也是我们前面的例子触犯的天条
4、函数指针不能作为信号或槽的参数,因为其格式比较复杂,moc处理不了。但可以用typedef把它定义成简单的形式再使用。(这招可真够绝的)
5、用枚举类型或typedef的类型做信号和槽的参数时,必须fully qualified。这个词中文不知道怎么翻译才合适,简单的说就是, 如果是在类里定义的, 必须把类的路径或者命名空间的路径都加上,防止出现混淆。如Qt::Alignment之类的,前面的Qt就是Alignment的qualifier,必须加上,而且有几级加几级。
6、信号和槽不能返回引用类型
7、signals和slots关键字区域只能放置信号和槽的定义,不能放其它的如变量定义等
呵呵,这些限制条款感觉颇像不平等条约, 是不是让你大开眼界了呢?其实这些限制有一部分应该当作bug来论处,只是对Qt编程影响不算太大,可暂时忽略,所以被归入优先级很低的问题处理了(意思就是可能永远都不改了)。