每个人对语言的编程习惯都不一样,这里简单介绍一下自己在学习使用Qt时养成的编程习惯,仅供参考。
1、命名规则
1.1 常规命名规则
1.1.1 类命名规则
适用对象:
(1)窗口控件实现类(所有之间或间接继承于QWidget类的实现类)
规则:命名以V 开头 示例:VTestWidget
(2)其他类
规则:命名以C开头 示例:CTestDialog
(3)所有类
规则:除开头文字外,第二个字母也需要大写,命名遵循驼峰命名法 示例:参照其他类的示例
1.1.2 函数命名规则(一般为类内)
(1)类内普通函数
规则:适用驼峰法,首字母小写 示例:initTestWidget()
(2)自定义的信号
规则:一般以**signal_**为前缀 示例:signal_btnTest_clicked();
(3)自定义响应槽
规则:一般以**slot_**为前缀 示例:slot_btnTest_clicked();
(4)自动响应槽(Qt自动连接槽)
规则:以on_ + 对象名_ + 信号名 示例:ui中命名为btnAdd的QPushButton点击信号,自动响应槽应该命名为on_btnAdd_clicked();
(5)所有函数共用命名规则(个人不喜欢用的命名规则,感觉代码写出来后期不好维护)
规则:除前缀外不能使用下划线_,其他命名都可以都不会报错
注:自定义的信号使用特殊命名主要为和 Qt 自带的信号槽区分。自定义的信号一般不要使用自动连接(on_对象名_信号名)
1.1.3 变量命名规则(一般为类内)
(1)类成员变量
规则:普通成员以m_ 为前缀,静态成员以ms_ 为前缀 注: int类型以m_i为前缀 long类型以m_l为前缀 long long类型以m_ll为前缀 QString类型以m_s为前缀 bool类型以m_b为前缀 QStringList类型以m_slt为前缀 QList类型以m_lst为前缀 指针类型为m_p为前缀等
示例:int m_iTest、long m_lTest、long long m_llTest、QString m_sTest、bool m_bTest、CTestDialog *m_pTestDialog等
(2)静态变量(static)、全局变量(global)
规则:以s、g加下划线为前缀 示例:s_nTest、g_pLoader、gs_TestStatus
(3)所有变量共用命名规则
规则:驼峰法命名,除前缀外首字母小写,使用单独的字母作为首字母;除前缀外不允许使用下划线 示例:nCount、pAppLoader、m_nCount、s_iLooker,只要不以下划线为首,其他的没有特定规则,全凭个人喜好来命名。
1.1.4 常量命名规则
所有常量
规则:全部使用大写,单词之间使用下划线分割;开头要注明常量类型 示例:NUM_TIMER_INTERVAL、STR_APP_NAME
ui界面对象命名规则
ui界面中每个控件都有一个对象名,这个名字在代码中设置数据时可能会用到,而且名字在贴图的样式表中经常用到。创建一个控件后,个人喜欢按照一定的命名规则对其进行命名,方便后期使用。
控件命名规则:
控件类型 | 命名规则 | 命名示例 |
---|
所有控件 | 使用驼峰命名法,不允许有下划线,开头使用标志类型短语 | | Widget | w开头 | wMainContainerName | Frame | frm开头 | frmMainContainerName | Push Button、Tool Button、Command Link Button | btn开头 | btnTestName | Check Box | cb开头 | cbTestName | Radio Button | rbtn开头 | rbtnTestName | Dialog Button Box | btnbx开头 | btnbxConfirmName | List Widget、List View | lst开头 | lstTestName | Tree Widget 、Tree View | tr开头 | trTestName | Table Widget、Table View | tb开头 | tbTestName | Column | col开头 | colTestName | Group Box | gb开头 | gbTestName | Tab Widget | tbw开头 | tbwTestName | Stacked Widget | stkw开头 | stkwTestName | Tool Box | tlb开头 | tlbTestName | Combo Box、Font Combo Box | cmb开头 | cmbTestName | Line Edit、Text Edit、Plain Text Edit、Text Browser | edt开头 | edtTestName | Spin Box、Double Spin Box | spb开头 | spbTestName | Time Edit、Date Edit、Date/Time Edit | tm开头 | tmTestName | scroll bar,、Slider | sld开头 | sldTestName | Label | lbl开头 | lblTestName | Graphic View | gpv开头 | gpvTestName | Progress Bar | pb开头 | pbTestName |
其他:
- Layout 和 Spacer 无需特殊命名,一般使用默认名字即可
- 列表中未列出的控件,可以根据实际情况按照第一条规则(所有规则)自己命名即可
2、基本编码规则
2.1 数据和显示分开 程序储存数据的结构要单独设计,不允许将数据直接以类似列表的方式存储在窗口或者 控件类中
2.2 注意封装 (1)数据以及窗体类成员变量不应设计为 public,应设计访问方法供他人访问;复杂的数据 处理过程应设计数据管理类进行处理 (2)简单的数据结果可设计成结构体 (3)尽量不使用全局变量,以成员变量代替
2.3 窗体布局工作通过 UI 文件实现,尽量不用代码
2.4 设计 UI 类结构时遵照从顶层窗口向下的原则,注意拆分,单个 UI 类中不应处理多个业 务逻辑
2.5 注意资源的分配和释放,原则为谁分配谁释放
2.6 ui设计中如果没有必要,尽量使用QPlain Text Edit替代QText Edit控件
3、类函数编程习惯(个人)
3.1 函数一般头文件中,喜欢一开始写上注释模板,表明该函数有什么作用 如下模板
3.2 一般使用QT Creator创建的文件都是使用#ifndef来避难文件重包含的。而使用visual studio编译器加上Qt插件一般是默认是#pragma once。个人喜欢使用#ifndef,其中各有优缺点,自己按习惯就好。
3.3 一般使用创建ui界面时,个人喜欢将ui转变为ui指针进行使用,在析构函数中进行删除即可。
3.4 喜欢将头文件中创建的函数进行分类和注释。 一般顺序为为public、protected、private、signals、private slots
所有示例如下(头文件.h)
#ifndef _VCONFERENCENOTICEFRAME_H
#define _VCONFERENCENOTICEFRAME_H
#include <QFrame>
#include "ui_vconferencenoticeframe.h"
class VConferenceNoticeFrame : public QFrame
{
Q_OBJECT
public:
VConferenceNoticeFrame(QWidget *parent = Q_NULLPTR);
~VConferenceNoticeFrame();
public:
void updateItem(QString sGroupID, QString sGroupName, QStringList sltGroupMember);
private:
void initControl();
signals:
void signal_btnNoticeOK_clicked();
private slots:
void on_btnNoticeOK_clicked(bool checked);
private:
Ui::VConferenceNoticeFrame *ui;
QPushButton *m_pBtnAdd;
QString m_sGroupID;
};
#endif
4、其他规则
3.1 程序界面贴图通过样式表完成,不能硬编码在代码或 Ui 文件里 3.2 资源文件(样式表和图片等)应该设计为动态编译和加载 3.3 程序运行时配置信息数据应集中保存和处理 3.4 单个项目的源代码根据功能模块拆分存放在不同的目录里,在 VS 工程中按照目录建立 包进行管理
|