0,Qt和MFC对比
面试的时候可能都会问,为什么开发C++用QT而不用MFC,查阅了一些资料,总结有以下几点,面试可以这样回答:
先说QT:
- 跨平台,可在Windows、 Linux、Unix等多平台开发。
- QT做的GUI开发要比MFC要好,并且QT界面库支持CSS,界面设计更方便更美观。
- 面向对象的特性体现的比MFC明显,在命名,继承,类的组织等方面保持了优秀的一致性,代码写起来比较优雅。
- 近几年MFC没有太大的发展,QT一直在更新,功能也越来越强大。
再说MFC:
- MFC主要是对Windows API的封装,所以只能用于windows平台,在windows平台下的地位毋庸置疑。
- MFC运行程序的效率比QT高。
- MFC的库比QT更全。
个人总结:
- 现阶段还是MFC的用户量较大,近几年QT暂时还不能撼动MFC的地位,但是应该看得更加长远一些。
- 无论是QT还是MFC都只是编程的开发工具,程序最重要的是架构,其次是算法,最后是界面实现。更应该注重基础: C/C++的特性,数据结构与算法之类等。
一,Qt的意义
1,Qt简介:
Qt是一个跨平台的C++的图形用户界面应用程序框架。它为成功内需开发者提供图形界面所需要的所有功能。面向对象,易扩展,并且允许真正的组件编程
2,Qt发展:
- 1991年最早由奇趣科技公司开发,
- 1996年开始进入商业领域(马提亚斯·埃特里希创建的KDE项目)。
- 2008年Qt被诺基亚收购。成为诺基亚旗下的编程语言。
- 2012年Qt又被Digia公司收购。
- 2014年发布跨平台的集成开发环境Qt Creator 3.1.0。同年又发布5.3正式版,支持对目前主流平台的支持:iOS、Android、WP(Windows phone 已关闭)等移动平台。
3,平台:
- Windows:XP,Vista,win7,win8,win10
- Unix/Linux:Ubuntu(建议LTS版)
- Mac OSX
- Embedded(嵌入式):有帧缓冲支持的嵌入式Linux平台,Windows CE
4,Qt版本:
- 商业版:为商业软件开发,提供传统商业软件发行版,并且提供在商业有限期内的免费升级和技术支持服务。
- 开源版:为开发自由而设计的源码软件,提供和商业同样的功能,在GUN通用公共许可下免费
5,Qt Creator:
是一个用于Qt开发的请谅解跨平台开发环境,有两大益处:1,提供首个专为支持跨平台开发而设计的集成开发环境(IDE),并确保首次接触Qt框架的开发人员能快速上手和操作。2,即使不开发Qt应用程序,Qt Creator也是简单易用且功能强大的IDE。
6,Qt优点:
- 1,跨平台,几乎支持所有平台
- 2,接口简单,易上手,学习Qt框架对学习其他框架有参考意义
- 3,面向对象,高度模块化,可重用性好,易开发
- 4,丰富的API
- 5,大量的开发文档
- 6,可进行嵌入式开发
二,Qt5的安装
1,下载Qt5
- 1,Qt离线下载地址下载地址
- 2,选择archive项目 -> qt -> 选择版本(我选择的5.12.12,大公司由于历史包袱,技术积累比较多,版本更新跨度大易出问题)-> 根据平台,选择开发环境,我这使用Windows
- 3,下载完成之后,如果有Qt账户的可以不用关注网络直接安装,如果没有Qt账号的可以断一下网,这样能跳过账号登录,选择位置安装
- 4,选择安装项:
- 在Windows系统下,选择Windows开发的编译工具开发会方便一些,点击next,配置安装组件,选择MSVC32位版本和64位版本;
- Sources是源码 建议勾选,可以通过看源码来了解Qt的原理;
- UWP在Windows下的移动端开发 使用场景很少,Windows系统的手机几乎退出市场了
- Tools是一个Debug调试工具,如果做嵌入式的话,增加 勾选上Strawberry Perl;
- 5,Qt设置完成后,next,接受协议,接下来就是安装的等待,根据计算机配置不同安装时间不同。
- 6,到此安装完成
2,Qt Creator环境认识
- Qt主界面有
- 欢迎:Projects, 示例,教程,Marketplace
- 编辑:项目调试使用
- 设计:项目调试使用
- Debug:项目调试使用
- 项目:项目结构呈现
- 帮助:帮助里面提供很多Qt开发过程中使用的库文件
三,Qt项目介绍
1,新建项目
-
1,在欢迎模块-> New->新建项目,里面包含应用(application)、库(library),其他项目(QT插件)、空项目(Non-Qt Project)、导入库(import Project)
-
2,选择Build System,Qt使用qmake编译系统(5.0之后支持),如果项目需要迁移环境,比如Linux等,选择CMake
-
3,Detail里面 Base Class-> 选择QMainWindow(主窗口),QWidget(非模态视图),QDialog(对话框)
-
4,翻译文件,语言:根据项目需求选择语言,这里选择Chinese大陆
-
5,Kits工具集根据需求选择,我这里选择2017的32位
- MSVC:是微软开发的编译环境,我们使用Windows操作系统做开发时,使用微软的编译环境出现bug的机会少一些。我们都直到32位操作系统和APP,最大的寻址范围只有4G,这里我们做简单演示,基本上都是小app,用不4G内存,我们选择32的MSVC编译环境
-
6,版本控制里面如果需要支持移动端设备,添加相应配置即可,这里我们简单起见不用加版本控制:
-
项目管理:在多人协作开发项目使用,还有版本的迭代和回滚所需要的功能,到后续再讲述,直接点击完成。
2,项目文件介绍
- 1,项目建好后,qt开发环境帮我们把所有初级文件都建立好了
- 2,创建完成后,我们可以运行看看效果:
- 3,main.cpp介绍
- main函数,应用程序的入口
- QApplication:Qt应用程序的头文件,每个Qt开发的界面程序都需要使用
- 上图中,main函数为带参数的主函数
- QApplication a(argc, argv); 创建一个Qt框架的App对象a,每个app有且仅有一个a对象
- QTranslator:翻译器
- MainWindow:创建一个自定义的窗口对象w
- w.show():创建的窗口对象w调用show()函数才能显示
- a.exec():app对象a,调用exec()函数循环接收信号,对信号处理,若为关闭信号则退出app
- 4,mainwindow 介绍
- Q_OBJECT:信号和槽是Qt开发的基础,它可以将两个毫无联系的对象连接在一起,槽和普通的C++函数一样,只有它和信号连接在一起后,当发信号时,槽会自动被调用,只有加入了Q_OBJECT,才能使用Qt里的signal和slot机制。
- parent:指向父类的一个指针。
3,调试器问题
- 有些朋友可能会遇到调试器问题,发现调试器无法工作,这是因为win10的SDK默认是没有安装调试工具的,需要自己安装
四,QPushButton
1,手动创建QPushButton
- 1,引入头文件,#include
- 2,构造函数里面创建QPushButton对象,析构函数记得delete
- 3,设置button属性:
2,可视化创建QPushButton
- 编辑->Forms文件里面双击要创建的.ui桌面板
图形界面对按钮的创建及修改非常方便,所见即所需,在右下角部分为对象的属性设置框,在其中修改数据,可视化界面中能及时看到修改后的效果。
3,属性面板常用功能介绍
一些常用的属性参数:
- ObjectName:对象名,这在属性框中是不可修改的,但可以右击按钮对象>修改对象名称,来修改。
- Enbled:是否启用该按钮,如果不启用,运行时,整个按钮为灰色不可点击状态。
- Geometry:几何参数,(220,110)是坐标原点,91x31是对象宽高
- Palette:颜色参数,这里直接继承父类的颜色
- Font:字体参数
- Cursor:光标,是指鼠标移动到该按钮上的光标样式,这里依然是箭头
- styleSheet:调整颜色,背景,字体的颜色
五,Qt帮助文档:Qt助手的使用
1,打开Qt助手
点击系统,搜索assistant,看到:
我们可以通过帮助文档,学习Qt,助手中有所有类,控件,方法的介绍,对我们学习Qt,有很大帮助。
比如,索引来搜索 QPushButton:
2,简单介绍助手文档内容
- qmake:QT+=widgets:在编译的时候,在.pro文件中必须加上widgets模块,但这是个基础模块,默认已经加入的,如果我们需要TCP网络的时候,需要使用到QTcpSocket类,那么就需要在.pro文件里面添加network模块,不然无法使用网络。
- Inherits:QAbstractButton 这个是告诉该类继承了QAbstractButton类。
- InHerited By:QCommandLinkButton,该类的子类。
- 除此之外,还有一些,公开的,保护的,私有的一些方法,给我们写程序提供了丰富的接口
六,Qt对象树
1,什么是对象树
- Qt中的QObject会用对象树来组织管理自己,比如创建一个QObject并指定父对象是,就会把自己加入到父对象的childre()列表中,也就是QList<QObject *>变量中。
- 我们每new一个对象 都会给他指定一个父类,比如:一个对象myObject,而这个对象在构造的时候也都要指定一个父类,即QObject。
2,对象树模式的好处
- 好处即,当父对象被析构时,子对象也会被析构,从一定程度上讲,简化了内存回收机制。Qt运用对象树模式,当父对象被析构时,子对象自动delete掉,不用再写一堆释放对象的代码。
- 系统会根据这个树状结构,释放整个结构的内存
3,对象树的问题
- 自动析构,涉及C++语法的问题,如果子对象,由于系统机制,自动释放,可能存在子对象被二次释放,过度析构,栈释放时,在堆上的对象导致崩溃
- 调整栈释放顺序后,即可解决崩溃问题:
七,Qt中的信号和槽
类似于,发送和接收。
1,信号和槽(Signal&Slot)
- 信号与槽(Signal&Slot)是Qt的基础,也是Qt的一大创新,因为有了信号与槽的编程机制,在Qt中处理 界面各组件的交互操作时,变得更加直观和简单,它可以让app开发人员把互不了解的对象绑定在一起
2,信号(Signal)
- 信号就是在特定情况下被发送的事件,eg:PushButton最常见的信号就是鼠标单击时发送的clicked()信号,一个ComboBox最常见的信号是选择的列表项变化时发送的CurrentIndexChanged()信号。
- GUI程序设计主要就是对界面各组件的信号相应,只需要知道什么情况下发送哪些信号,合理去响应和处理这些信号即可。
3,槽(Slot)
- 槽就是对信号的响应函数,与一般的C++函数一样,可以定义在类的public,private,protect,可以具有任何参数,也可以直接被调用。
- 槽函数与一般函数不同的是,槽函数可以与一个信号关联,当信号被发送,关联的槽函数被自动执行。
- 信号和槽关联是用,QObject.connect()函数实现的,基本格式为:
QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));
参数1:信号的发送者
参数2:发送的信号
参数3:信号的接收者
参数4:处理函数(槽函数)
4,信号与槽示例QPushButton
- 1,我们打开Qt助手,搜索QPushButton,发现没有signal,只有个public slot
- 找QPushButton的父类,QAbstractButton,找到signals
- 2,可以看到里面有4个信号
- 3,关于响应的槽函数,一般在窗口里面,比如,MainWindow类是QMainWindow的子类:
- 4,从public slot里面找函数
- 5,注意click和clicked的使用,clicked是信号, click是槽函数,示例如下: