本站所有文章由本站和原作者保留一切权力,仅在保留本版权信息、原文链接、原 文作者的情况下允许转载,转载请勿删改原文内容, 并不得用于商业用途。 谢谢合作。
这个题目乍一听起来有股冷飕飕的味道, 呵呵, 别想歪了, 纯粹和封建迷信无关哦。 笔者也是无意中发现在Qt的文档里有一篇关于moc工具的limitation的文章,里头的东西让笔者还挺惊讶的, 撰文以memo。
起因是qt群里有人问一个链接的错误, 程序结构很简单, 就是designer设计主界面,在代码里用多重继承方式使用, 奇怪的错误信息如下:
moc_mainwin.cpp:39: error: ‘staticMetaObject’ is not a member of ‘Ui::MainWindow’
moc_mainwin.cpp: In member function ‘virtual void* MainWin::qt_metacast(const char*)’: moc_mainwin.cpp:56: error: ‘qt_metacast’ is not a member of ‘MainWin::qt_metacast(const char*)::QMocSuperClass’
moc_mainwin.cpp: In member function ‘virtual int MainWin::qt_metacall(QMetaObject::Call, int, void**)’: moc_mainwin.cpp:62: error: ‘qt_metacall’ is not a member of ‘MainWin::qt_metacall(QMetaObject::Call, int, void**)::QMocSuperClass’
make: *** [moc_mainwin.o] Error 1
Qt自动生成的moc文件竟然也会编译出错?这可真有点匪夷所思。 笔者把工程拿过来从头看到尾也没有看出任何错误可能会导致这个链接错误。 N长时间后,一个编译阶段报出的warning引起了笔者注意, 大意是说多重继承不能从两个QObject类继承, 这就怪了,它怎么会把我的UI类也当成是从QObject派生的呢? 有了这个提示,笔者尝试着修改多重继承的那行代码:
class MainWin: public Ui::MainWindow, public QWidget
改为
class MainWin: public QWidget, public Ui::MainWindow
结果你猜怎么着?奇迹发生了……呵呵,编译成功!原来竟然是继承的顺序造成的问题。 莫非这是Qt的bug?
给trolltech support发bug report得到了这样的回答:
This is actually a known limitation which has been documented for some time, when using multiple inheritance you have to specify the QObject based class first and then the other class. Its mentioned in the documentation at:
http://doc.trolltech.com/4.5/moc.html
under the limitations section.
原来如彼! 看来咱的道行还不够,这么重要的文档竟然从来都不知道它的存在。
仔细阅读一下居然发现还有不少Qt中和moc相关的编程限制需要我们注意, 各位看官也来受受再教育吧:
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编程影响不算太大,可暂时忽略,所以被归入优先级很低的问题处理了(意思就是可能永远都不改了)。
qt文档中还有一篇关于Qt为什么没有用模板来实现信号和槽的分析文章, 也是一篇有意思的科普读物, 推荐e文好的去看看。http://doc.trolltech.com/4.5/templates.html
分享到:
相关推荐
在Linux环境下进行Qt编程是许多开发者的选择,因为Linux提供了丰富的开源工具和强大的系统支持。Qt是一个跨平台的应用程序开发框架,适用于多种操作系统,包括Linux、Windows、Mac OS等。本教程将带你逐步走进Linux...
此外,还涵盖了如何使用Qt Designer进行可视化布局设计,通过拖放控件和调整属性,可以快速创建界面原型。 对于Qt的网络编程,书中会讲解如何使用QNetworkAccessManager和相关类进行HTTP、FTP等网络请求,以及数据...
通过这个项目,开发者不仅可以学习到如何使用Qt设计用户界面,还能掌握如何与MySQL数据库交互,同时了解在ARM开发板上运行和调试应用程序的技巧。这为构建嵌入式系统中的数据管理和可视化提供了实用的示例。
"一步一步学习QT编程"的资源旨在为初学者提供一个深入理解QT的平台,通过实际的程序代码和逐句分析,帮助新手快速掌握QT编程的核心概念和技术。 首先,QT库提供了丰富的组件,用于构建跨平台的桌面、移动和嵌入式...
QT编程是一种基于C++的图形用户界面开发框架,由Qt Company提供支持,广泛应用于桌面、移动设备和嵌入式系统的应用程序开发。"24小时学通qt编程"这个压缩包很可能是为了帮助初学者在短时间内迅速理解并掌握QT编程...
11. **QT测试和调试**:使用QT Creator的内置工具进行单元测试和调试。 12. **项目实战**:通过实际的小型项目巩固所学知识,例如制作一个简单的桌面计算器或音乐播放器。 压缩包中的"24小时学通qt编程1"可能是教程...
Qt引入了一些特定的C++特性,如 moc (Meta-Object Compiler) 用于处理元对象系统,以及信号和槽机制,它是事件驱动编程的关键。 4. **信号与槽机制** Qt的信号与槽机制是其核心特性之一,用于对象间的通信。当一个...
6. **UI设计**:使用Qt Designer创建用户界面,然后导出为.ui文件,用代码生成器生成C++代码。 7. **线程安全**:了解Qt的线程模型,避免在主线程和工作线程间共享数据时引发的问题。 总的来说,理解和遵循这些编程...
通过这样的配置,可以在Linux环境中顺利地使用QT进行开发,并利用其丰富的类库和技术特性来构建高性能的应用程序。 总之,QT不仅提供了一个功能全面、易于使用的开发框架,还通过其核心机制如信号与槽,以及元对象...
2. **Qt Designer**:掌握使用Qt Designer创建和编辑GUI界面的方法,通过拖放组件,快速构建UI原型。 3. **C++与Qt集成**:学习如何将Qt类库与C++代码结合,实现程序逻辑,并理解 moc 工具在其中的作用。 4. **...
总的来说,Linux下的Qt编程涉及到C++语言基础、面向对象编程、Qt库的使用、GUI设计、事件处理、网络编程和数据库操作等多个方面。通过学习和实践,开发者可以创建出跨平台的高质量应用程序。《Linux下Qt编程入门》这...
本源码集合是针对Qt5编程初学者设计的,旨在帮助理解Qt5的基础概念和编程技巧。 在Qt5中,主要包含以下几个核心模块: 1. **Qt Widgets**: 提供了丰富的用户界面控件,如按钮、文本框、对话框等,用于构建图形用户...
Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(Meta Object Compiler, moc))以及一些宏,Qt很容易扩展,并且允许真正地组件编程。2008年,Qt Company科技被诺基亚公司收购,Qt也因此成为诺基亚旗下...
通过这些步骤,可以在Linux环境下顺利使用QT进行开发工作。 #### 结论 QT作为一种强大的跨平台GUI库,不仅因其广泛的平台支持和丰富的功能集而受到欢迎,更重要的是其信号与槽机制为开发者提供了简单而强大的对象...
在实际项目中,开发者还需要掌握如何处理线程、异步操作、国际化和本地化,以及如何使用Qt的测试框架进行单元测试和集成测试。对于网络编程,QT提供了丰富的API,可以方便地处理HTTP、FTP等协议,以及套接字通信。...
Qt的moc(Meta-Object Compiler)工具用于处理包含`Q_OBJECT`宏的C++源文件,生成元对象代码,支持Qt的信号和槽机制。qmake是一个构建系统,用于自动化编译过程,它可以生成Makefile或者其他IDE的项目文件,简化项目...
`来完成,这使得文件内的所有代码可以直接使用Qt中的类和函数,而无需每次都写上`Qt::`前缀。然而,这种做法在大型项目中可能会导致全局命名空间污染,因此建议只在必要的地方(如函数内部)使用`using`语句,或者在...
《C++ GUI Qt 4编程(第二版)》是一本深入浅出的书籍,专注于介绍如何使用Qt 4框架进行图形用户界面(GUI)开发。Qt是一个跨平台的应用程序开发框架,广泛应用于Windows、Linux、Mac OS X以及其他操作系统。本书是...
### Qt MOC 处理器 UML 图解析 #### 标题解读 - **Qt MOC**:MOC 是 Qt Meta-Object Compiler 的缩写,是 Qt 框架中...这些元素和结构共同构成了 Qt MOC 的内部架构,有助于开发者深入了解 MOC 如何处理和生成元数据。
解释:QT 的信号和槽机制需要使用 connect 函数来连接,而不是任意相连。 12. 下面类声明中有几处错误? 正确答案:c. 3 解释:该类声明中有三个错误:public slot 声明错误、setValue 函数声明错误、...