前面的课程中我们已经讲解了如何使用 Qt 创建简单的程序以及 Qt 的核心特性:信号槽的使用,但是一个程序中用到的内容实际比这要复杂的多。本次课程我们就来创建一个真正意义上的 Qt 程序:一个功能相对完整的计算器 。
[laputa-er](https://github.com/laputa-er/qt_demos
- c语言基础/tree/master/l04_Calculator)
1 程序开发的准备工作
介绍在开始写一个程序前的必要准备工作,这样能使程序写起来更有条理,增加效率。
计算器程序分析与设计
说明:简单的软件开发流程
- 分析(做什么)
- 设计(怎么做)
- 编程
- 测试
- 维护
软件需求分析
UI
- 主要部分
- 菜单栏
- 标题栏
- 状态栏
功能
- 基本运算
- 单位转换
设计
UI
- QMainWindow
- 显示框,按钮
功能
- 基本运算
- 单位转换
QtCreator 完成界面设计
第一步:在属性列表中设置属性
geometry
- 宽度:250
- 高度:360
windowTitle:计算器
第二步:在对象列表中删除多余的组件
第三步:菜单栏
第四步:按钮布局
- 同时设置按钮的 minimumSize 和 maximumSize 中的高度和宽度改变按钮的大小
- 通过拉伸组件,覆盖多个 cell,就可以实现 grid layout 中 cell 的合并
alt + 拖动按钮
实现按钮的复制- 按钮比较多,因此重新命名为容易区分的名字,在程序中会用到
命名法简介
Qt API 采用的是 驼峰命名法
,因此建议 Qt 程序统一都使用驼峰命名法。
驼峰命名法
- 大驼峰:My_VarName
- 小驼峰:my_VarName
匈牙利命名法
微软员工发名的一种标识符命名法,[标识符分类]_[标识符类型][实际含义]
.例如,s_szMyName
标识符分类 | 说明 |
---|---|
s_ |
静态变量 |
m_ |
C++ 成员变量 |
sz_ |
字符串 |
fn_ |
函数 |
- 系统匈牙利命名法
- 匈牙利应用命名法
2 Qt 窗口与对话框
一个程序中 UI 是 interface,那么窗口自然就是骨架。在开发程序前,对 Qt 的窗口类有一些了解是必须的。
2.1 QMainWindow
动作(Action)
Qt 使用 Action
简化对菜单和工具栏的使用。动作是一个可以添加到任意数量的菜单和工具栏上面的项,只需要创建并设置动作,然后创建菜单或工具栏,最后把动作添加到上面就可以了。
QMainWindow 的使用
注意:QMainWindow 继承自 QWidget ,因此可以使用继承自 QWidget 的各种属性和方法。
案例
要点
- 添加菜单,并为菜单绑定触发时的动作
- 在状态栏显示信息
用到的 QMainWindow 方法的
- menuBar():获取菜单栏引用
- statusBar():获取状态栏引用
其他类
- QAction
- QMenu
- QTimer
头文件/mainwindow.h
1 |
|
源文件/mainwindow.cpp
1 |
|
2.2 QDialog
说明:程序的大部分内容都在主窗口显示,但有些内容不适合在主窗口显示,这是就有可能用到对话框。
顶层窗口和非顶层窗口
QDialog 实例创建时可以指定父窗口。
- 如果没有指定父窗口,会作为一个顶层窗口打开;
- 如果指定了父窗口,则在父窗口上打开,并以父窗口的中心作为自己的中心。
注意:在 windows 中,顶层窗口在任务栏中又一个位置,非顶层窗口则没有。
2.2.1 通过代码创建对话框
1 | /* 需要指定对话框的父对象 |
2.2.2 通过 Designer 创建对话框
相比主窗口,对话框没有菜单栏、工具栏和状态栏。
第一步: 创建对话框的 UI 文件
上面选择的模版对应的对话框,如下
第二步: 在需要对话框的地方引入前面生成的头文件
源文件/mainwindow.cpp
1 |
|
2.2.3 其他
Qt 提供了多种类型的对话框,比如
- 消息对话框
- 文件对话框
- 选择对话框
等。
延伸的知识点还包括
- 模态对话框
- 非模态对话框
- 如何防治对话框内存泄漏
等。
3 计算器程序实现
主要是基于 Qt 的计算器程序的代码实现及讲解。
4 附加功能实现
给计算器程序增加额外的附加功能。
4.1 QDialog 简单应用
通过给上面的计算器应用添加单位转换功能演示 Dialog 使用.
第一步: 在菜单中添加入口
第二步: 选择单位
会自动生成对应的动作,为其命名
第三步: 声明并实现相关的槽
1 |
|
第四步: 关联动作和槽
1 | connect(ui->actionUnitSelect, SIGNAL(triggered(bool)), this, SLOT(unitSelect())); |
4.2 常用的 Qt 静态函数
setWindowFlags
功能:设置窗口标记,比如标题栏的属性。