这是我们在编写Qt代码时使用的高级编码约定的概述。有关Qt代码规范,请参见Qt代码风格一文。对于QML,请参阅QML代码规范一文。
C++特性
不要使用异常。
不要使用rtti(运行时类型信息:即typeinfo结构,dynamic_cast或typeid运算符,包括引发异常)。
谨慎明智地使用模板,不仅仅是因为可以使用。 提示:使用编译自动测试可以查看测试中的所有编译器是否支持C++功能。
Qt源代码中的约定
所有代码仅是ascii(仅7位字符,如果不确定,请运行man ascii).
因为我们内部的语言环境太多,而且UTF-8和latin1系统的组合不健康。通常,您甚至不知道通过单击您喜欢的编辑器中的"保存"就可以破坏字符超过127个字符的范围。
对于字符串:使用\nnn(其中nnn是要在其中输入字符串的任何字符编码的八进制表示形式)或\xnn(其中nn是十六进制)。示例:QString s = QString::fromUtf8("13\005");
对于文档中的变音符号或其他非ASCII字符,请使用qdoc的命令或使用相关的宏。例如\uuml表示ü。
每个QObject子类都必须具有Q_OBJECT宏,即使它没有信号或槽也是如此,否则qobject_cast将失败。
在connect语句中规范化信号/槽的参数(请参阅QMetaObject::normalizedSignature),以更快地进行信号/槽查找。您可以使用qtrepotools/util/normalize规范化现有代码。
头文件包含
在公共头文件中,请始终使用以下形式包括Qt头: #include 。库前缀对于Mac OS X框架是必需的,对于非qmake项目也非常方便。
在源文件中,首先包括Qt的头文件,然后是通用的头文件。用空行分隔类别。例:
#include /* Qt类头文件 */#include /* STL 头文件 */#include /* 系统头文件 */
如果需要包括qplatformdefs.h,请始终将其作为第一个头文件包含。
如果您需要包含私有头文件,请当心。不管whatever_p.h位于哪个模块或目录中,请使用以下语法:
#include
类型转换
避免使用C强制转换,而建议使用C ++强制转换(static_cast,const_cast,reinterpret_cast)。
因为reinterpret_cast和C风格强制转换都是危险的,但是至少reinterpret_cast不会删除const修饰符。
不要使用dynamic_cast,不要对QObject使用qobject_cast或重构设计,例如,通过引入type()方法(请参阅QListWidgetItem)。
使用构造函数强制转换简单类型。例:int(myFloat)代替(int)myFloat。
另外重构代码时,编译器会立即通知您是否强制转换会很危险。
编译器/平台的特定问题
使用问号运算符时要格外小心。如果返回的类型不同,则某些编译器会生成在运行时崩溃的代码(您甚至不会收到编译器警告)。例如:
QString s;
return condition ? s : "nothing";
// 运行时崩溃