文本基本上对照《Qt 5.9 C++ 开发指南》(人民邮电出版社)章节安排来总结。
80% 转载 20%原创总结吧
第二章 GUI应用程序设计基础
2.1 UI文件设计与运行机制
2.1.1 项目文件组成
- 项目组织文件.pro 存储项目设置的文件
- 主程序入口文件main.cpp 实现main()函数的程序文件
- 窗体界面文件 widget.ui 一个XML格式存储的窗体上的元件及其布局的文件
- widget.h 是所设计的窗体类的头文件,widget.cpp 是widget.h 里定义类的实现文件。
- 注:在C++里,任何窗体或界面组件都是用类封装的,一个类一般有一个头文件和一个源程序文件。(
我就说搬运其实有点无意义,你看这段话是不是废话
2.1.2 项目管理文件
“ Qt += core gui” 项目中加入core gui模块
core gui 是Qt用于GUI设计的类库模块,如果创建的是控制台(Console)应用程序,就不需要添加core gui
若 项目中涉及到数据库操作类,即需要添加sql模块 , 即加“ Qt += sql”
“greaterThan(Qt_MAJOR_VERSION , 4) += widgets" Qt主版本大于4时,才加入widgets模块
“TARGET = samp2_1" 生成的目标可执行文件的名称,即编译后生成可执行文件samp2_1.exe
"TEMPLATE = app" 表示项目使用的模板是app,是一般的应用程序
后面还有SOURCES HEADERS FORMS 都是文件配置,会自动生成...
正常的编写中,其实没有关注过这个文件,绝大多数都是在生成项目,和新建、删除文件的时候就会自动更新的。 问题容易出现在不同版本的项目互相覆盖叠加,这种时候容易出现更新不及时,需要手动排错,比如删掉一些没必要的配置。
2.1.3 界面文件
双击.h界面文件 会打开集成在Qt Creator中的Qt Designer(即一个UI设计器)对窗体进行可视化设计。
主要分为
- 组件面板 窗口左侧界面设计组件面板 分为多组,如Layouts,Buttons,Display Widgets等
- 中心窗体 窗口中间待设计的窗体
- Signals和Slots编辑器与Action编辑器 窗体中间下方的两个编辑器,Signals和Slots编辑器用于可视化地进行信号与槽的关联,Action编辑器用于可视化设计Action
- 布局和界面设计工具栏 窗口上方一个工具栏,主要实现布局和界面设计
- 对象浏览器 窗口右上方树状视图显示窗体中各个组件之间的布局包含关系,显示每个组件的对象名称和类名称
- 属性编辑器 窗口右下方 可以显示某个选中的组件或窗体的各种属性及其取值,可以直接在这里修改这些属性的值。 并且可以看出选中的组件类的继承关系。
2.1.4 主函数文件
int main(){
QApplication a(argc,argv);//定义并创建应用程序
widget w;//定义并创建窗口
w.show();//显示窗口
return a.exec();//应用程序运行
}
这也是普通Demo自动生成的东西....差别在于第二行 定义并创建的可能是一个普通窗口也可能是带菜单栏工具栏的窗体。
2.1.5 窗体相关文件
.h .cpp .ui在上面已经介绍过了 内部一些具体代码在后续会提到,就直接跳过了
主要介绍一下ui_widget.h(也是自动生成的东西,也没啥好说的...就是在UI设计器中设计的UI界面会自动生成的类定义文件
这里有一段提示,我感觉理解也不是很透彻,但感觉很流批的样子。搬上来
提示:
ui_widget.h 文件里实现界面功能的类是Ui_Widget。 再定义一个类Widget从Ui_Widget继承而来,并定义在namespace Ui里,这样Ui::Widget 与widget.h 里的类Widget同名,但是用namespace区分开来。所以,界面的Ui::Widget 类与文件widget.h 里定义的Widget类实际上是两个类,但是Qt的处理让用户感觉不到Ui::Widget类的存在,只需要知道在Widget类里用ui指针可以访问可视化设计的界面组件就可以了。
然而,我就真的只知道可以用指针访问组件....
2.2 可视化UI设计
这一部分主要就是介绍怎么在UI设计器里,直接创建窗体,怎么设置各个窗口组件的属性和对应的槽函数... 有点想略过,还是搬一点觉得重要的东西
2.2.1 实例程序功能
界面组件属性设置注意:
1.objectName 是窗体上创建的组件的实例名称,界面上的每一个组件需要有一个唯一的name,程序里访问界面组件的时候也是通过这个那么进行访问的,自动生成的槽函数名称也是带有这个name的,所以组件的objectname需要在设计程序前(即编写.h 和.cpp 之前)设置好,设置好一般就不要改动,不然涉及地方的都需要进行更改。
2.窗体的objectname就是窗体的类名称,在UI设计器里不要修改窗体的objectName,窗体的实例名称需要在使用窗体的代码里定义。
2.2.2 界面组件布局
这一部分主要就是看UI怎么设计了,没什么难度 ,但是要做好看其实也不是很容易的事情
1.界面组件的层次关系
这里需要使用一些容器类,如QGroupBox、QTabwidget,QFrame等。把一些组件放入这些容器类中就产生了层次关系。
2.布局管理
Qt提供了布局组件面板
| 布局组件 | 功能 |
| ---------------- | ---------------------------------------------------------- |
| Vertical Layout | 垂直方向布局,组件自动在垂直方向上布局 |
| Horizontal Layout | 水平方向布局,组件自动在水平方向上布局 |
| Gird Layout | 网格状布局,网状布局大小改变时每个网格大小都会改变 |
| Form Layout | 窗体布局,与网状布局类似,但是只有最右侧的一列网格会改变大小 |
| Vertical Spacer | 一个用于水平分隔的空格 |
| Horizontal Spacer | 一个用于垂直分隔的空格 |
略过UI设计器工具栏各个按钮的功能了。与上表功能差不离,还需自己研究拓展了。
(MarkDown暂不支持表格)
3.伙伴关系与Tab顺序
这部分压根没看懂。放弃搬运。
感觉没啥大用。
2.2.3 信号与槽
这一部分应该是很重要的部分了。 基本上是Qt编程的基础,也是Qt的一大创新。因为有了信号与槽的编程机制,在Qt中处理界面各个组件的交互操作时变得更加直观和简单。
信号(signal) 就是在特定情况下被发射的事件,比如按钮上的单击,选择框的值改变等。GUI程序设计的主要内容就是对界面上各个组件的信号的响应,只需要知道什么时候发射哪些信号,并合理的去响应和处理这些信号就可以了。
槽(slot) 就是对信号响应的函数。槽就是一个函数,与一般的C++函数是一样的,可以定义在类的任意部分(public,private,protect),可以带任意参数,可以直接调用。与一般函数不同的是,槽函数可以与一个信号关联,当信号被发射时,关联的槽函数自动执行。
基本格式: QObject::connect (sender,SIGNAL(signal()),receiver,SLOT(slot()));
(QObject可忽略)
sender 是发射信号的对象的名称,signal() 是信号名称。
receiver是接收信号的对象的名称,slot() 是槽函数名称。
SIGNAL和SLOT是QT的宏,用于指明信号和槽,并将它们的参数转换成相应的字符串。
注意
- 一个信号可以连接多个槽,当一个信号与多个槽函数关联时,槽函数按照建立连接时的顺序依次执行。
- 多个信号可以连接同一个槽。
- 信号可以连接另一个信号。这样,当一个信号发射时,也会发射另一个信号,实现某些特殊的功能。
- 严格的情况下,信号与槽的参数个数和类型需要一致,至少信号的参数不能少于槽的参数。如果不匹配,会出现编译错误或运行错误。
- 使用信号和槽的类中,必须在类的定义中加入宏Q_OBJECT。
- 当一个信号被发射时,与其关联的槽函数通常被立即执行,就像正常调用一个函数一样,只有当信号关联的所有槽函数执行完毕后,才会执行发射信号处后面的代码。
2.2.4 可视化生成槽函数原型和框架
这一部分就没什么搬的,就是样例。
值得一提的是,如果在可视化界面中直接创建槽函数,那么在代码中无需关联信号和槽函数,会在ui_.h自动识别槽函数的方法名,提取出里面的objectName 和 signal ,即找出窗体中的组件和信号,随后与槽函数进行匹配。
在自定义槽函数后,要在窗体创建后手工将信号与槽函数进行关联。
2.3 代码化UI设计
在创建项目的时候,取消勾选“Generate form”(创建窗体),项目创建后没有ui文件。
然后在定义中加入各个组件,定义信号,定义槽函数,其实相当于把ui_.h文件和.ui文件的内容手动搬到前面来,代码量巨大,所以下文不做过多赘述。
提一点:因为没有ui文件,所以也无需定义指向ui的指针,想要获取组件时直接初始化后就可以获取。
2.3.1 实例功能
2.3.2 界面创建
2.3.3 信号与槽的关联
2.4 混合方式UI设计
这一部分,就是结合前两种方式,因为纯手工创建ui界面实在太麻烦了呀,但是好像纯可视化实现不了部分功能(不知道是不是版本老了,书上一些功能只能用手工创建,但是我在电脑上可以直接可视化出来。。但还是打了一遍。也有可能是我的问题?不太明白)
2.4.1 设计目的
↑
2.4.2 创建项目并添加资源文件
添加资源文件主要是为了项目中的一些图表样式..暂略不讲了,创建添加很简单。
2.4.3 设计Action
QAction 主要在界面设计中提供一些菜单栏,工具栏的功能按钮。
在UI设计器中中间下方有Action Editor 可以新建出一些Action并进行编辑。具体操作感觉搬书也没什么意义了。懂英文就很好理解了,不懂试一试也就试出来了。
2.4.4 设计菜单和工具栏
将Action往设计窗体中拖就行... 拖到能放下的地方就行,还能右键添加分隔符,easy。
2.4.5 代码创建其他界面组件
这里书上是通过代码添加了窗体下方的状态栏...类似2.3。跳过了。
2.4.6 Action的功能实现
1.编辑功能的Action的实现
将QTextEdit内置的剪切复制粘贴清除等函数当做槽函数
2.其他Action的功能实现
Action的信号主要是trigger()和trigger(bool) ,在选择是否传一个布尔参数时,要考虑到有几个Action是否有相同的属性可以接收到信号(划掉,自己理解的,怎么选择我也不是很懂)。比如说某个信号会将Action的复选状态作为一个参数传递。(凑合理解吧,就是有些复选框 有些单选项 ,能传进来是否选择了的组件 在实现功能时就要选带bool的。要是只是单击就不用。
3.Action的enabled和checked属性的更新
简单讲就是判断当前Action能不能触发,比如还没有复制的时候,粘贴Action就应该是灰的。
就是通过setEnabled和setChecked两个方法实现。
2.4.7 手工创建的组建的信号与槽
似上↑ 略。
2.4.8 为应用程序设置图标
- 将一个.ico 图标文件 复制到项目源程序目录下
- 将配置文件.pro 中添加一行代码
RC_ICONS = AppIcon.ico
(AppIcon.ico就是图标文件)
2.5 Qt Creator使用技巧
书中快捷键介绍。搬运的作用不大,略过吧。
2.6 自我总结
以为一上午就可以搬完,没想到拖拖拉拉还是拖到下午。
在思考后续的学习,是先看一遍书跟着打完代码,然后再看一遍书搬运上来;还是就一遍,看书+打代码+搬运。
前一种感觉要花费好多时间,但其实第二遍打的过程中还是会发现第一遍没有注意到的东西
后一种看起来就要剩下很多时间,并且在打代码的过程中遇到的问题也就能几十记录下来了。否则搬书的时候基本上都忘了当时打的时候是怎么麻烦,怎么遇到问题解决问题的了。
em有点纠结,先把看完的打完吧。然后试一试快一点的方式,省一点时间就可以做更多的事情啦。
—— 暂无评论 ——