每个人对语言的编程习惯都不一样,这里简单介绍一下自己在学习使用Qt时养成的编程习惯,仅供参考。
1、命名规则 1.1 常规命名规则 1.1.1 类命名规则 适用对象: (1)窗口控件实现类(所有之间或间接继承于QWidget类的实现类)规则:命名以V 开头
示例:VTestWidget
规则:命名以C开头
示例:CTestDialog
规则:除开头文字外,第二个字母也需要大写,命名遵循驼峰命名法
示例:参照其他类的示例
规则:适用驼峰法,首字母小写
示例:initTestWidget()
规则:一般以**signal_**为前缀
示例:signal_btnTest_clicked();
规则:一般以**slot_**为前缀
示例:slot_btnTest_clicked();
规则:以on_ + 对象名_ + 信号名
示例:ui中命名为btnAdd的QPushButton点击信号,自动响应槽应该命名为on_btnAdd_clicked();
规则:除前缀外不能使用下划线_,其他命名都可以都不会报错
注:自定义的信号使用特殊命名主要为和 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
规则:驼峰法命名,除前缀外首字母小写,使用单独的字母作为首字母;除前缀外不允许使用下划线
示例:nCount、pAppLoader、m_nCount、s_iLooker,只要不以下划线为首,其他的没有特定规则,全凭个人喜好来命名。
规则:全部使用大写,单词之间使用下划线分割;开头要注明常量类型
示例:NUM_TIMER_INTERVAL、STR_APP_NAME
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开头 | btnbx/confirm/iName |
| 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.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 #include4、其他规则#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; // 群组ID }; #endif // !_VCONFERENCENOTICEframe_H
3.1 程序界面贴图通过样式表完成,不能硬编码在代码或 Ui 文件里
3.2 资源文件(样式表和图片等)应该设计为动态编译和加载
3.3 程序运行时配置信息数据应集中保存和处理
3.4 单个项目的源代码根据功能模块拆分存放在不同的目录里,在 VS 工程中按照目录建立
包进行管理



