QT学习之个人编程规范

2023-11-11

每个人对语言的编程习惯都不一样,这里简单介绍一下自己在学习使用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

其他:

  1. Layout 和 Spacer 无需特殊命名,一般使用默认名字即可
  2. 列表中未列出的控件,可以根据实际情况按照第一条规则(所有规则)自己命名即可

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 函数一般头文件中,喜欢一开始写上注释模板,表明该函数有什么作用
如下模板

/*!
* @file vconfattendeeitemframe.h	文件类名
* @brief 会议页面组成人员控件		该函数所起作用的注释
* @author dong				类文件编写人
* @version 1.0				版本号
* @date 2021/09/12			类创建日期
* @copyright 版权所有(c)...,保留所有权利。	版权所有权
*/

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)

/*!
* @file vconferencenoticeframe.h
* @brief 发送会议通知页面
* @author dong
* @version 1.0
* @date 2021/09/07
* @copyright 版权所有(c)。
*/

#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:		// 外部调用接口函数
    /*! VConferenceNoticeFrame::updateItem
    * @brief 更新数据
    * @param sGroupID 群组ID
    * @param sGroupName 群组名
    * @param sltGroupMember 群组成员
    */
    void updateItem(QString sGroupID, QString sGroupName, QStringList sltGroupMember);
    
private:	// 类中调用函数
    /*! VConferenceNoticeFrame::initControl
    * @brief 初始化类内基础数据
    */
    void initControl();

signals:	// 触发信号
    /*! VConferenceNoticeFrame::signal_btnNoticeOK_clicked
    * @brief 跳转到页面信息显示界面信号
    */
    void signal_btnNoticeOK_clicked();
    
private slots:	// 响应槽
    /*! VConferenceNoticeFrame::on_btnNoticeOK_clicked
    * @brief 确定按钮响应槽
    * @param checked 是否按下
    */
    void on_btnNoticeOK_clicked(bool checked);
 
private:        // 数据成员
    Ui::VConferenceNoticeFrame *ui;
    QPushButton *m_pBtnAdd;
    QString m_sGroupID;     // 群组ID
};
#endif // !_VCONFERENCENOTICEFRAME_H

4、其他规则

3.1 程序界面贴图通过样式表完成,不能硬编码在代码或 Ui 文件里
3.2 资源文件(样式表和图片等)应该设计为动态编译和加载
3.3 程序运行时配置信息数据应集中保存和处理
3.4 单个项目的源代码根据功能模块拆分存放在不同的目录里,在 VS 工程中按照目录建立
包进行管理

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT学习之个人编程规范 的相关文章

  • 安装多个版本的 Qt 库

    我在windows中安装了QtSDK 它的Qt库版本是4 7 0 现在我想为 mingw 和 VS2008 安装 Qt 库版本 4 8 2 我怎样才能做到这一点 如何向QtCreator引入多个版本 注意 我已经从以下位置下载了库http
  • setContextProperty 和对象的 setProperty 之间的区别

    我现在真的很困惑 有什么区别 QQmlApplicationEngine engine engine rootContext setContextProperty myObject userData and object gt setPro
  • qt项目如何设置安装路径

    我正在寻找与 qmake configure prefix 等效的内容 基本上 我想覆盖默认的安装 部署目录 这是如何用命令行 qmake 指定的 我还使用 QtCreator 构建了很多 gui 项目 并且我想知道如何在 QtCreato
  • QGraphicsView 和 eventFilter

    这个问题已经困扰我两天多了 所以我想我应该问一下 我在Win7上使用Qt 4 5 3 用VC2008编译 我有 MyGraphicsView 继承 QGraphicsView 和 MyFilter 继承 QObject 类 当我将 MyFi
  • 有没有办法在没有 QApplication::exec() 的情况下使用 Qt?

    有没有一种安全的方法可以在不调用 QApplication exec 的情况下使用 Qt 我有许多不同的对象正在对多个资源执行长期进程 至少其中一个正在与 Web 应用程序服务器进行通信 我正在制作一个 GUI 应用程序 提示用户在正确的时
  • 如何在按下托盘图标菜单操作时执行功能?

    int main int argc char argv QApplication oApp argc argv QAction action1 QMenu menu QSystemTrayIcon TrayIcon QIcon favico
  • QTcpSocket 有时不发送数据

    我有两个 QT 应用程序 一个应用程序可以被认为保存了大数据 它每秒向第二个应用程序发送大约 10 KB 的数据块 之前我尝试使用QUdpSocket来传输数据 但由于MTU限制在2 5K左右 并且需要自己分割和重新组合数据 所以我改用QT
  • 如何在模型更改时停止ListView“跳跃”

    我需要做什么 我需要创建一个聊天窗口用一个ListView在 QML 中存储聊天消息 我设置listView positionViewAtEnd 以便跟踪最后的消息 我禁用positionViewAtEnd当我向上滚动时 我可以阅读过去的消
  • 加权 Voronoi 的 CGAL 2D APOLLONIUS 图 - 如何生成和获取面和顶点?

    我正在尝试根据阿波罗尼乌斯图生成加权沃罗诺伊 我正在使用 CGAL 库 我找不到如何从 apollonius 获取面和顶点的好例子 我有以下类型定义 typedef double NT typedef CGAL Cartesian lt N
  • 从布局中按名称获取小部件

    如果我想从 python Qt 的布局中获取特定的小部件 我应该如何进行 到目前为止我所做的 for i in range self ui horizontalLayout 14 count here it does fail name s
  • 在 Qt5 中,是否需要 Q_INVOKABLE 来从 QML 调用公共 QObject 函数?

    我刚刚意识到我可以调用暴露于 QML 的对象的几乎任何函数 现在我对 Q INVOKABLE 很好奇 Qt5docs http doc qt io qt 5 qtqml cppintegration exposecppattributes
  • 重定向 python 交互式帮助()

    我正在为使用 Qt 的应用程序开发交互式 python shell 但是我似乎无法获得重定向的交互式帮助 我的 python 代码中有这个 class OutputCatcher def init self self data def wr
  • 如何将图像显示为缩略图

    我有一个QTreeView显示硬盘驱动器和目录 我也有一个QListView显示图像文件如下 但我想将图像显示为缩略图 如下所示 My code mainWidget mainWidget QWidget parent QWidget pa
  • QToolButton:更改菜单位置

    使用菜单时QToolButton菜单显示在按钮的正下方 有没有办法在按钮的左侧 右侧显示菜单 我知道这个问题不久前已得到回答 但我想为此问题添加新答案 因为接受的答案不再有效 实际上 更改 QToolButton 上的菜单位置非常容易 您需
  • Qt:测量事件处理时间

    我想测量我的应用程序中的哪些事件在主线程中需要很长时间才能执行 阻塞 GUI 或者至少是否有任何事件花费的时间超过 比如说 10 毫秒 显然 我对需要很长时间的任务使用线程和并发 但有时很难在其他线程中放入的内容和可以保留在 GUI 中的内
  • Qt - 设置不可编辑的QComboBox的显示文本

    我想将 QComboBox 的文本设置为某些自定义文本 不在 QComboBox 的列表中 而不将此文本添加为 QComboBox 的项目 此行为可以在可编辑的 QComboBox 上实现QComboBox setEditText cons
  • 同时从多个流中捕获、最佳方法以及如何减少 CPU 使用率

    我目前正在编写一个应用程序 该应用程序将捕获大量 RTSP 流 在我的例子中为 12 个 并将其显示在 QT 小部件上 当我超过大约 6 7 个流时 问题就会出现 CPU 使用率激增并且出现明显的卡顿 我认为它不是 QT 绘制函数的原因是因
  • 如何使用meta-toolchain-qt5构建Qt(带有QtWebEngine支持)?

    我正在尝试使用构建 Qtmeta toolchain qt5 但是当我通过这样做时poky glibc x86 64 meta toolchain qt5 cortexa7hf vfp vfpv4 neon toolchain 2 0 1
  • QSerialPort 中的 readAll() 不包括最后发送的响应

    我正在使用 Qt 来控制串行设备 如果我向串行设备发送命令 我会执行类似的操作serial gt write command r n 我制作了一个按钮 它将纯文本小部件内的文本更改为串行端口的响应 为了获得串口的响应 我使用serial g
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table

随机推荐

  • 本地运行hexo-theme-butterfly报错重定向次数过多

    本地运行hexo theme butterfly报错重定向次数过多 Github被墙了故选择使用Gitee 顺便搭建gitee page博客 使用了一个比较简约好看纯净的主题hexo theme butterfly 在这基础上进行配置 问题
  • 笔试,计算贡献值,2022-9-2

    计算时间区间的贡献值 若同一时间有多个应用程序 均分贡献值 每个vector表示一个应用的开始 结束时间段 一个应用可能有多个时间段 考虑 1 区间重叠 均分贡献值 2 浮点数计算 用整型处理单个时间会去掉小数 累计起来就错了 includ
  • 小样本中的自监督

    自监督脉络 SimCLR SimCLRV2 BYOL Moco SimSiam 一些典型操作 原图地址 When Does Self supervision Improve Few shot Learning 2019 ECCV 关键点 通
  • 计算机视觉(四):使用K-NN分类器对CIFAR-10进行分类

    1 引言 之前我们学习了KNN分类器的原理 现在让我们将KNN分类器应用在计算机视觉中 学习如何使用这个算法来进行图片分类 2 准备工作 创建项目结构如图所示 在datasets文件中下载数据集Cifar 10 k nearest neig
  • 基于Tensorflow搭建卷积神经网络CNN(花卉识别)保姆及级教程

    项目介绍 TensorFlow2 X 搭建卷积神经网络 CNN 实现人脸识别 可以识别自己的人脸哦 搭建的卷积神经网络是类似VGG的结构 卷积层与池化层反复堆叠 然后经过全连接层 最后用softmax映射为每个类别的概率 概率最大的即为识别
  • C#使用checked检查溢出

    在进行数值类型之间的强制转换时 可能会丢失信息 比如将 int 类型转换为 short 类型时 如果 int 类型会的值大于 short 类型所能存储的最大值 那么就会发生溢出 1 使用checked检查溢出 通常情况下 发生溢出时并不会自
  • this指向

    1 在全局环境中的this window 无论是否在严格模式下 在全局执行环境中 在任何函数体外部 this 都指向全局对象 use strict console log this window console log this windo
  • 联邦学习 深度学习对抗攻击

    联邦学习本身 联邦学习 实际上是一种加密的分布式机器学习技术 参与各方可以在不披露底层数据和底层数据的加密 混淆 形态的前提下共建模型 如果机构之间的数据无法互通 一家企业一家机构数据量有限 或者是少数巨头公司垄断大量数据 而小公司很难获得
  • 移动端Touch (触摸)事件

    一 常见的触摸事件 touchstart touchmove和touchend touchstart事件 当手指触摸屏幕时候触发 即使已经有一个手指放在屏幕上也会触发 touchmove事件 当手指在屏幕上滑动的时候连续地触发 在这个事件发
  • 怎么选择boost升压电路的电感?只要三个公式

    原文来自公众号 工程师看海 添加微信 chunhou0820 获取仿真文件 BOOST电源架构是一种非常经典的升压电源方案 它是利用开关管开通和关断的时间比率 维持稳定输出的一种开关电源 它以小型 轻量和高效率的特点被广泛应用在各行业电子设
  • 1-1、Qt基本概念以及界面绑定信号与槽的实例

    1 各种程序格式的选择方式 2 例子 新建mainwindow的项目 在ui拖动一个pushbuttton 点击界面下的信号与槽的部分 点击 然后选择发送者 信号 接收者 槽 一下为源码 sampl 1 pro Project create
  • yum提示 “Cannot retrieve metalink for repository: epel/x86_64” 的解决方法

    今天在centos7服务器上用yum的时候发现 yum命令不能用了 不管用yum什么命令都会出现如下提示 完整的错误提示如下 One of the configured repositories failed Unknown and yum
  • 深入理解[观察者模式]原理与技术

    观察者模式 Observer Pattern 也叫做发布 订阅 Publish Subscribe 模式 模型 视图 Model View 模式 这个模式的一个最重要的作用就是解耦 也就是将被观察者和观察者进行解耦 使得他们之间的依赖性更小
  • 【华为OD机试真题 C++】计算最大乘积 【2022 Q4

    前言 华为OD机试真题 C 本专栏包含华为OD机试真题C 解答 会实时更新收纳网友反馈 为大家更新最新的华为德科OD机试试题 为大家提供学习和练手的题库 订阅本专栏后可私信进交流群哦 答案仅供参考 不可照抄哦 题目描述 计算最大乘积 给定一
  • 【Unity3D】粒子光环

    作业要求 参考http i remember fr en 这类网站 使用粒子流编程控制制作一些效果 如 粒子光环 这个网站打不开 参考了一下师兄们的博客的图片 我看了一下 我感觉和上课做的粒子海洋有一些相似 就是需要变成一个环形 制作流程
  • JavaScript 数字去掉小数点后的0

    JavaScript 数字去掉小数点后的0 方法很简单 JavaScript提供了现成的方法 parseFloat function parseNum value value parseFloat value
  • 从头再来系列-Markdown基本语法

    以下内容摘抄于网络 Markdown 简介 Markdown 是一种轻量级标记语言 它允许人们使用易读易写的纯文本格式编写文档 Markdown 语言在 2004 由约翰 格鲁伯 英语 John Gruber 创建 Markdown 编写的
  • oracle基础知识

    1 oracle特点 2 oracle体系 实例 一组oracle后台进程以及在服务器中分配的共享内存区域 数据库 基于磁盘的数据文件 控制文件 日志文件 参数文件和归档文件等组成的物理文件集合 数据库服务器 三者之间的关系 实例用于控制和
  • 【DBeaver日常】查询出结果后,无法回到SQL编辑页面

    正常的查询页面 正常页面可以通过以下图示中的符号进行上下调整 上三角点击完以后的展示页面 如下图 下三角点击完以后的展示页面 如下图 误触以后的页面 误触以后可以通过下图中标示的部分进行恢复 结果面板恢复 最大化区域图示 选择上图中红色框线
  • QT学习之个人编程规范

    每个人对语言的编程习惯都不一样 这里简单介绍一下自己在学习使用Qt时养成的编程习惯 仅供参考 1 命名规则 1 1 常规命名规则 1 1 1 类命名规则 适用对象 1 窗口控件实现类 所有之间或间接继承于QWidget类的实现类 规则 命名