Qt 学习(二)
  • 2020 年 09 月 01 日
  • 140 次阅读
  • 3196 字
  • 暂无评论


文本基本上对照《Qt 5.9 C++ 开发指南》(人民邮电出版社)章节安排来总结。

80% 转载 20%原创总结吧

第二章 GUI应用程序设计基础

2.1 UI文件设计与运行机制

2.1.1 项目文件组成

  • 项目组织文件.pro 存储项目设置的文件
  • 主程序入口文件main.cpp 实现main()函数的程序文件
  • 窗体界面文件 widget.ui 一个XML格式存储的窗体上的元件及其布局的文件
  • widget.h 是所设计的窗体类的头文件,widget.cppwidget.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的宏,用于指明信号和槽,并将它们的参数转换成相应的字符串。

注意

  1. 一个信号可以连接多个槽,当一个信号与多个槽函数关联时,槽函数按照建立连接时的顺序依次执行。
  2. 多个信号可以连接同一个槽。
  3. 信号可以连接另一个信号。这样,当一个信号发射时,也会发射另一个信号,实现某些特殊的功能。
  4. 严格的情况下,信号与槽的参数个数和类型需要一致,至少信号的参数不能少于槽的参数。如果不匹配,会出现编译错误或运行错误。
  5. 使用信号和槽的类中,必须在类的定义中加入宏Q_OBJECT。
  6. 当一个信号被发射时,与其关联的槽函数通常被立即执行,就像正常调用一个函数一样,只有当信号关联的所有槽函数执行完毕后,才会执行发射信号处后面的代码。

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有点纠结,先把看完的打完吧。然后试一试快一点的方式,省一点时间就可以做更多的事情啦。


版权属于:如此

本文链接:https://www.songvei.cn/archives/78/


Qt

—— 暂无评论 ——