Qt学习及使用_第2部分_GUI程序设计基础---GUI程序结构

前言


       
        学以致用,通过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++的效率还是不错.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

重庆彭枫

你的鼓励是我创作的动力,谢谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值