QT 编码风格和惯例
i
QQTT 编编码码风风格格和和惯惯例例
DAR 编码:
修订日期:2012-11-29
QT 编码风格和惯例
ii
历史记录
软件/文件名: QT 编码风格和惯例 机密性
版本 日期 修订内容 修订人 职务 审核人
V1.0 2012-11-29 初稿 zq
确认 批准
组织 /职务 组织 /职务
日期和签名 日期和签名
QT 编码风格和惯例
iii
目 录
1 概述 .......................................................................................................................................................... 4
2 重要惯例 .................................................................................................................................................. 4
2.1 包含的头文件.................................................................................................................................. 4
2.2 变量命名原则.................................................................................................................................. 4
2.3 空白 ................................................................................................................................................. 6
2.4 大括号 ............................................................................................................................................. 7
2.5 圆括号 ........................................................................................................................................... 10
2.6 SWITCH 语句 .................................................................................................................................. 10
2.7 断行 ............................................................................................................................................... 11
2.8 继承与 VIRTUAL............................................................................................................................. 12
2.9 注释 ............................................................................................................................................... 12
3 重要原则 ................................................................................................................................................ 13
3.1 可读性比精炼更重要 .................................................................................................................... 13
3.2 相似的类应该具有相似的接口 .................................................................................................... 13
QT 编码风格和惯例
4
1 概述
良好的编程
规范
编程规范下载gsp规范下载钢格栅规范下载警徽规范下载建设厅规范下载
可以大幅提高一个程序的可读性、可维护性。编码规范是大家达成一致
的约定,这样大家的代码就可以互相看懂,维护起来更容易,思想更畅快的交流,经验更快
的得到传播。代码规范不是束缚程序员的桎梏,应该知道,不遵守规范的个性的代码并不代
表程序员的性格,并不能张扬个性。
软件开发领域并没有一个公认的、统一的编程规范,不同的软件开发项目或者组织会采
用不同的编程规范。因此,在利用 QT 编程时,其编程规范与部门现采用的 C++编程规范有
所不同。本文档是参照 C++编程规范、JAVA 编程规范对 QT 编码惯例和 QT 编码风格进行
适当修改后,形成的一份适合于 QT 开发的
总结
初级经济法重点总结下载党员个人总结TXt高中句型全总结.doc高中句型全总结.doc理论力学知识点总结pdf
性文档。
可读性、可理解性是代码的重要方面,本文档主要围绕如何去产生规范易懂的代码。
2 重要惯例
2.1 包含的头文件
在公用的头文件中,头文件包含总是使用这样的形式:
#include
2.2 变量命名原则
(1)每行一个变量;
(2)尽可能避免短的变量名;
(3)单字符的变量只在临时变量或循环的计数中使用;
(4)等到真正需要使用时再定义变量;
/ / Wr ong
i nt a, b;
char * c, * d;
QT 编码风格和惯例
5
/ / Cor r ect
i nt hei ght ;
i nt wi dt h;
char * nameOf Thi s;
char * nameOf That ;
(5) 以小写字符开头,后续单词以大写开头;
(6)避免使用缩写,即使对于“previous prev”这样广为接受的缩写形式,Qt 也
不予采纳,因为这
要求
对教师党员的评价套管和固井爆破片与爆破装置仓库管理基本要求三甲医院都需要复审吗
程序员记忆哪些单词被缩写、哪些没有被缩写;
/ / Wr ong
shor t Cnt r ;
char I TEM_DELI M = ' / t ' ;
/ / Cor r ect
shor t count er ;
char i t emDel i mi t er = ' / t ' ;
(7)类名总是以大写开头,以字母 Q 开始,表示该类是 Qt 软件包中定义的类,自定
义的类可以以大写字母 C 开头。此时,第二个字母也应该是大写的。而且,类的名字应该
是一个名词,比如 QFileSystemWatcher。
(8)函数名字以小写字母开始,应该是一个动词或者含有动词的短语,比如
collidesWithItem()。
(9) 全局常量名字中的字母都应该大写,比如 Q_BIG_ENDIAN。
(10)枚举常量的名字应该含有枚举类型的信息。这是由于枚举常量在 C++程序中可
被直接使用,如果其名字过于简单,可能会导致歧义。例如:
//Wrong
enum CaseSensitivity { Insensitive, Sensitive };
由于有上下文,枚举常量 Insensitve 及 Sensitive 在被定义时并没有任何歧义。然而,
当它们在程序其他地方被引用时,程序的读者难以理解它们的含义。因此,应该在它们的名
字中嵌入枚举类型的信息,比如:
//Correct
enum CaseSensitivity { CaseInsensitive, CaseSensitive };
QT 编码风格和惯例
6
(11)如果某个数据成员具有布尔类型,读取该数据的成员函数应该以“is”打头,比
如 isEmpty()、isMovingEnabled()。然而,如果该数据成员的名字是复数形式的,则不需要
加任何前缀,比如 scrollBarsEnabled()。
补充:在 Qt 例子编写中,对变量名有如下建议:
(1)成员变量前不要加"m_" 或其他什么东西
(2)如果参数名和成员变量名发生冲突,使用 "this->" 解决
voi d MyCl ass: : set Col or ( const QCol or &col or ; )
{
t hi s- >col or = col or ;
}
或
voi d MyCl ass: : set Col or ( const QCol or &newCol or ; )
{
col or = newCol or ;
}
(3)避免使用意义不明确的字符:
/ / Wr ong
voi d MyCl ass: : set Col or ( const QCol or &c)
{
col or = c;
}
注意:在构造函数中,会遇到同样的问题。但无论你信与不信,下面的可以工作。
MyCl ass: : MyCl ass( const QCol or &col or ; )
: col or ( col or )
{
}
2.3 空白
(1)采用 4 个空格;
QT 编码风格和惯例
7
(2)空格,不要用 TAB!
(3)利用空行将语句恰当地分组;
(4)总是使用一个空行(不要空多行);
/ / Cor r ect
i f ( f oo)
{
}
(5)对指针和引用,在类型和*、&之间加一个空格,但在*、&与变量之间不加空格;
char * x;
const QSt r i ng &mySt r i ng;
const char * const y = " hel l o" ;
(6)二元操作符前后加空白;
(7)类型转换后不加空白;
(8)尽量避免 C 风格的类型转换;
/ / Wr ong
char * bl ockOf Memor y = ( char * ) mal l oc( dat a. s i ze( ) ) ;
/ / Cor r ect
char * bl ockOf Memor y = r ei nt er pr et _cast ( mal l oc( dat a. si ze( ) ) ) ;
(9)除了断行外,不要尝试用空白对齐一些东西。
/ / Wr ong
x = r ect . x( ) ;
y = r ect . y( ) ;
wi dt h = r ect . wi dt h( ) ;
hei ght = r ect . hei ght ( ) ;
2.4 大括号
(1)基本原则:花括号永远单占一行,不要跟在语句后面,这样所有的大括号都风格
一致;
QT 编码风格和惯例
8
/ / Wr ong
i f ( codec) {
}
/ / Cor r ect
i f ( codec)
{
}
(2)控制语句的 body 中只有一行时不使用大括号;
/ / Wr ong
i f ( addr ess. i sEmpt y( ) )
{
r et ur n f al se;
}
/ / Cor r ect
i f ( addr ess. i sEmpt y( ) )
r et ur n f al se;
i f ( x)
{
/ / do somet hi ng st r ange
yyyyyyyyy = yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy +
zzzzzzzzzzzzzzzzzzzzzz;
}
例外 1:如果父语句跨多行,则使用大括号
/ / Cor r ect
i f ( addr ess. i sEmpt y( ) | | ! i sVal i d( )
| | ! codec)
{
r et ur n f al se;
QT 编码风格和惯例
9
}
例外 2:在 if-else 结构中,有一处跨多行,则使用大括号
/ / Wr ong
i f ( addr ess. i sEmpt y( ) )
r et ur n f al se;
el se {
qDebug( " %s" , qPr i nt abl e( addr ess) ) ;
++i t ;
}
/ / Cor r ect
i f ( addr ess. i sEmpt y( ) )
{
r et ur n f al se;
}
el se
{
qDebug( " %s" , qPr i nt abl e( addr ess) ) ;
++i t ;
}
/ / Wr ong
i f ( a)
i f ( b)
. . .
el se
. . .
/ / Cor r ect
i f ( a)
{
i f ( b)
. . .
QT 编码风格和惯例
10
el se
. . .
}
(3)如果控制语句的 body 为空,则使用大括号。
/ / Wr ong
whi l e ( a) ;
/ / Cor r ect
whi l e ( a) { }
2.5 圆括号
使用圆括号将表达式分组。
/ / Wr ong
i f ( a && b | | c)
/ / Cor r ect
i f ( ( a && b) | | c)
/ / Wr ong
a + b & c
/ / Cor r ect
( a + b) & c
2.6 switch 语句
(1)case 和 switch 位于同一列;
(2)每一个 case 必须有一个 break 或 renturn 语句,或者用注释说明无需 break。
swi t ch ( myEnum)
{
case Val ue1:
QT 编码风格和惯例
11
doSomet hi ng( ) ;
br eak;
case Val ue2:
doSomet hi ngEl se( ) ;
/ / f al l t hr ough
def aul t :
def aul t Handl i ng( ) ;
br eak;
}
2.7 断行
(1)保持每行短于 100 个字符(注意补充部分),需要时进行断行
(2)逗号放一行的结束,操作符放到一行的开头(操作符和同级的前一行对齐)
/ / Cor r ect
i f ( l ongExpr essi on
+ ot her LongExpr essi on
+ ot her Ot her LongExpr essi on)
{
}
例外:如果使用的 if 语句 和 && 或者 ||,对齐需要一点调整(否则控制语句和 body
会较难以分辨)
/ / Wr ong
i f ( dsf l j f sf skj l dsj k l j k l s j dk
&& f dsl j s j dsdl j k l s j s j kdf s
&& dsf l j kdf j k l dksdf j dj kf dksf dkj l d)
{
sadj dj ddadhsad;
}
/ / Cor r ect
i f ( dsf l j f sf skj l dsj k l j k l s j dk
QT 编码风格和惯例
12
&& f dsl j s j dsdl j k l s j s j kdf s
&& dsf l j kdf j k l dksdf j dj kf dksf dkj l d)
{
sadj dj ddadhsad;
}
对 while 或 else if,不存在这个问题:
whi l e ( dsf l j f sf skj l dsj k l j k l s j dk
&& f dsl j s j dsdl j k l s j s j kdf s
&& dsf l j kdf j k l dksdf j dj kf dksf dkj l d)
{
sadj dj ddadhsad;
}
补充:
(1)Qt 例子中比前面的
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
100 严格一点,采用的是 80;
(2)Qt Quarterly 中采用的是 58;
(3)Qt 书籍中采用的是 78 。
2.8 继承与 virtual
重新实现一个虚函数时,头文件中不放置 virtual 关键字。
2.9 注释
(1)函数注释三部分:功能、参数和返回值。每个程序都应该以一段简短地、说明其
功能的注释开头。请为每个函数书写注释以说明函数做了些什么。如果有参数和返回值,也
需要对其进行解释。
(2)变量、定义等注释:对于每个静态变量和全局变量,请添加相应的注释语句。对
于重要的变量、定义等进行注释。
QT 编码风格和惯例
13
3 重要原则
3.1 可读性比精炼更重要
例如,语句:
QSlider *slider = new QSlider(12, 18, 3, 13, Qt::Vertical, 0, "volume");
虽然精炼但是可读性差。类 QSlider 的 API 应该被改为:
QSlider *slider = new QSlider(Qt::Vertical);
slider->setRange(12, 18);
slider->setPageStep(3);
slider->setValue(13);
slider->setObjectName("volume");
又比如,当我们调用一个控件的成员函数 repaint()重新绘制该控件时,有时我们希望先
擦除其背景再绘制,有时却又希望直接绘制以提供速度。一种做法是令该函数包含一个布尔
类型的参数,表示是否需要擦除背景。这种做法虽然只用了一个函数来处理两种情形,看起
来比较简洁,但是可能导致下面的代码:
widget->repaint(false);
API 的初级用户可能将其理解为“不重新绘制控件”。因此,为了提高代码的可读性,
更好的一个做法是用两个函数来实现上述两种情形:成员函数 repaint()擦除背景再绘制控件,
而成员函数 repaintWithoutErasing()只绘制控件、不擦除背景。
3.2 相似的类应该具有相似的接口
例如,Qt 中的 QTextStream 负责以文本形式输入或者输出程序中的数据,而
QDataStream 负责以二进制方式输入或者输出。由于二者具有相似的功能,它们都重载了
运算符“<<”以及“>>”,使得熟悉其中一个类的用户能够迅速学会另外一个类的使用方
法,缩短了学习周期。