前言
学以致用,通过QT框架的学习,一边实践,一边探索编程的方方面面.
参考书:<Qt 6 C++开发指南>(以下称"本书"),继承关系沿用本书说法:父类/子类,而非传统C++使用基类/派生类
标识说明:概念用粗体+倾斜.重点内容用(加粗黑体)---重点内容(红字)---重点内容(加粗红字),
本书原话内容用深蓝色标识,比较重要的内容用加粗倾斜下划线深蓝色标识
引入
本书第二章第一部分内容.他回答了GUI程序结构是什么,可视化UI设计是什么.至于怎么来的,本书没有提及,要分析源码才知道.(笔者也没看源码,不知道是不是全部能看懂,或者会不会牵涉到专利等问题)学习过程中可以从代码到模型做一些反向推导.
GUI项目文件组成
项目管理树
选择QWidget作为基类,并勾选Generate from复选框,创建后的项目管理树包括了5部分内容:
1>.pro文件:项目配置文件
2>widget.ui:用于窗口界面可视化设计的文件.
3>main.cpp:主程序文件,包含main()函数---程序入口
4>widget.h:窗口类定义头文件,用到了UI文件widget.ui中的一个可视化设计的窗口界面.
5>widget.cpp:对应widget.h的源程序文件.
---解读:第2>和第4>中的widget.ui文件是不相同的.第2>项中的widget.ui是程序员编写的文件,是满足需求后的结果.第4>项中的widget.ui是框架中的文件---定义了数据和函数,给程序员提供"原料"
第4>和第5>归属于同一个翻译单元(参看<C Primer Plus 第6版>P375最后一段) ---解读完毕
项目配置文件
如果选择qmake构建系统,生成一个后缀为".pro"的项目配置文件
qmake是构建项目的工具软件,根据项目配置文件中的设置生成Makefile文件,然后C++编译器就可以根据Makefile文件进行编译和链接(本书中的连接是别字).对于Qt项目,qmake还会自动为元对象编译器(meta-object compiler,MOC)和用户界面编译器(user interface compiler,UIC)生成构建规则.
本书P16第二段:Qt项目的配置文件是自动生成的,一般不需要手动修改
本书P16第三段:当我们向项目中添加文件时,Qt Creator会自动更新配置文件中的内容
---解读:简单的说,项目配置文件告诉程序员使用了Qt框架中哪些内容.
项目配置文件自动生成,自动更新,所以不用自己操作,看懂意思即可.
编译器有什么内容,以及是怎样工作的(笔者也不清楚)是由qmake实现的,如果不用程序员自己修改qmake,可以暂时先略过. ---解读完毕
UI文件
后缀为.ui的文件是用于窗口界面可视化设计的文件,如widget.ui.双击项目管理目录树中的文件widget.ui,Qt Creator会打开内置的Qt Designer对窗口界面进行可视化设计.
---解读: .ui文件是程序员用可视化设计的工作结果.
Qt Designer的工作区域大致有个了解,关注属性编辑器---可以在里边修改部分元素的属性,查看类继承关系和信号与槽编辑器---为元素增加功能.
主程序文件
C++程序入口文件
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
---只有短短几行,所有的程序内容都被封装了进去.基本上是固定格式.
本书P18:QApplication是Qt的标准应用程序类,main()函数里的第一行代码定义了一个QApplication的变量a,他就是应用程序对象.然后定义了一个Widget类型的变量w,Widget是本示例设计的窗口的类名称,定义变量w就是创建窗口对象,然后用w.show()显示此窗口.
---解读:一切都是对象.应用程序和窗口都是对象.
窗口相关文件
说明:窗口相关文件的理解,在于推导Qt使用的程序模型,以及面向对象的用法,同时需要对C++语法有一定了解,这几页内容有点难度.但看不懂也不会影响使用,所以视情况可选择跳过.
窗口界面设计和界面组件的事件处理是GUI程序设计的主要任务.窗口的UI可视化设计结果是如何被转换为代码,窗口事件是如何与处理程序关联起来的呢?这些涉及窗口UI设计和程序运行的基本原理.
---解读:本书P19到P23讲了基本原理,内容有点复杂,笔者画个图帮助理解.
解释:
1>Qwidget类是框架类,理解成真正在做事的对象.
本书P21setupUi函数调用中,生成的图形元素,如QLabel标签类对象,QPushButton按钮类对象;以及其他容易读懂的设置字体,重新设置大小,对象名称设置等函数都是Qwidget类对象widget在调用.
2>Widget类对象(左边),
他继承了Qwidget类,但在本书P20widget.cpp定义中,虽然他包含了命名空间Ui内的Widget类对象指针ui,再在ui_widget.h的setupUi中把自己"扔了进去"---构造函数中ui->setupUi(this),其本质还是在使用父类Qwidget对象,并没有加入新的东西.有点像在"承上启下",他的作用仅仅是使用其父类Qwidget对象做事而不让其受到"污染".
3>命名空间Ui内的Widget类(右边)
作用和左边的Widget类对象类似,在父类ui_widget.h和Qwidget间搭了个桥.
4>注意这部分内容和main()函数的联系,其关联语句
Widget w; //定义并创建窗口对象
当生成一个Widget对象,代表生成了一个窗口(本质上还是Qwidget对象) ,同时在Widget的构造函数中调用setupUi进行了初始化窗口的设置---本书例中加入了一个标签(类型QLabel),内容"Hello Qt6",设置了文字大小等属性;又加入了一个按钮(类型QPushButton),添加了信号-槽函数.
5>窗口文件设计可能联系某种设计模式.
其他窗口文件相关内容
本书P20第二段开始:窗口类Wdiget的定义.文件widget.h的主体部分是一个继承自Qwidget的类Widget的定义.Widget类中包含创建窗口界面,实现窗口上界面组件的交互操作,以及其他业务逻辑.
Widget类定义的第一行语句插入了一个宏Q_OBJECT,这是使用Qt元对象系统的类时必须插入的一个宏.插入了这个宏之后,Widget类中就可以使用信号与槽,属性等功能.
---解读:再和main()函数关联, 实现窗口上界面组件的交互操作,以及其他业务逻辑被封装入
w.show();
---解读完毕
本书P22中间:这里将Widget作为labDemo和btnClose的父容器,这一段内容,待元对象系统理解,现在只知道Qwidget类型和其他类型QPUshButton,QLable存在某种关系.
思考
Qt在使用时,如何做到实时更新内容?
本书作者在P23举了个例子:可以通过ui指针访问窗口界面上的所有组件.修改Widget类的构造函数来实现.笔者想弄明白在使用Qt设计界面时怎样做到实时更新的.
=============================内容分割线↓===================================
以下是笔者思考,不保证准确:
当操作Qt Creator进行界面编辑时,例如鼠标拖动一个按钮到设计窗体中.widget.ui内容更新,再修改ui_widget.h中的setupUi函数,增加相关语句.因此实时更新(每一次键鼠操作),是先更新widget.ui内容,并更新代码,然后产生的效果呈现到屏幕上.
=============================内容分割线↑===================================
小结
Qt中的可视化UI设计的一点分析和思考.
作为IDE,Qt Creator使用的感觉还可以,操作比较快,说明C++的效率还是不错.