Qt 学习之路 2 读书笔记--准备篇

这篇博客是作者学习Qt的读书笔记,介绍了Qt作为完整C++应用程序框架的特点,包括其跨平台能力、优缺点以及开源特性。通过实例展示了如何运行第一个Qt程序,包括下载Qt、创建项目、选择基类,并解释了QApplication和事件循环的作用。同时,文章还提到了Qt中一个常见的内存管理问题,即在关闭窗口时可能出现的二次删除问题。
摘要由CSDN通过智能技术生成

写在文前

此系列为豆子Qt学习之路2的读书笔记,记录下自己学习Qt的新手历程。

一、Qt简介

完整的C++应用程序框架

常见的C++开发框架有很多,比如STL,Boost,VCL,Ultimate++,这些都支持跨平台。不同的是,Qt不仅仅是一个C++界面库,它在实现了一套基于C++反射的基础上,包含了网络、数据库、多媒体、测试框架、国际化工具、打包部署模块、WebKit等。所以可以分模块地去了解Qt。

跨平台

Qt不仅仅能够运行在桌面环境中,还可以运行在嵌入式平台以及手机平台。

优缺点

  1. Qt语法类似Java的Swing;使用信号槽(signal/slot)机制,十分清晰;
  2. 这种机制带来的后果是需要使用Qt的 moc 对程序进行预处理,才能够再使用标准的 make 或者 nmake 进行正常的编译;
  3. 信号槽的调用要比普通的函数调用慢大约一个数量级Qt4文档中说明该数据,但Qt5 尚未有官方说明)。
  4. Qt的界面也不是原生风格的,尽管Qt使用 style 机制十分巧妙地模拟了原生界面。

开源

现在Qt的开源版本使用的是 GPLv3 以及 LGPL 协议。这意味着,你可以将Qt作为一个库连接到一个闭源软件里面。

二、运行第一个Qt

Qt官网(http://www.qt.io/download/)直接下载,我下的时候是Qt5.4,安装过程和一般软件无异,自带IDE Qt Creator。

  1. 打开Qt Creator,给大家截个图,其他没说的用到再介绍。
    这里写图片描述
  2. 文件->新建文件或项目->Application->Qt Widgets,点choose确定。
    这里写图片描述
  3. 接下来就是设置项目名称、路径,下一步默认Kits,直接点下一步。
  4. 出现选择基类,QMainWindow和QDialog都是继承自QWidget。QWidget类是所有用户界面对象的基类,QMainWindow 类提供一个有菜单条、锚接窗口(例如工具条)和一个状态条的主应用程序窗口,QDialog类是对话框窗口的基类。反正新手,随便选个QMainWindow玩玩。
    这里写图片描述
  5. 下一步是项目管理,添加为子项目,选择版本控制系统,这个可以自己选择。最后点完成。
    这里写图片描述
  6. 可以看到,Qt Creator 帮助我们在 HelloWorld 项目文件夹下生成了四个文件:main.cpp,mainwindow.cpp,mainwindow.h 和 HelloWorld.pro。pro 文件就是 Qt 工程文件(project file),由 qmake 处理,生成 make 程序所需要的 makefile;main.cpp 里面就是一个main函数,作为应用程序的入口函数;其他两个文件就是先前我们曾经指定的文件名的文件。
    这里写图片描述
  7. 点击 Qt Creater 左侧下面的绿色三角按钮即可运行,我们来看下main.cpp的代码。
    main()函数中第一句是创建一个QApplication类的实例。对于 Qt 程序来说,main()函数一般以创建 application 对象(GUI 程序是QApplication,非 GUI 程序是QCoreApplication。QApplication实际上是QCoreApplication的子类。)开始,后面才是实际业务的代码。这个对象用于管理 Qt 程序的生命周期,开启事件循环,这一切都是必不可少的。
    之后直接创建一个MainWindow窗口,调用show()函数将其显示出来。
    main()函数最后,调用app.exec(),开启事件循环。我们现在可以简单地将事件循环理解成一段无限循环。正因为如此,我们在栈上构建了MainWindow窗口,却能够一直显示在那里(试想,如果不是无限循环,main()函数立刻会退出,MainWindow当然也就直接析构了)。
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

最后多说下qt经常遇到的一个bug。刚才的代码里有一句
MainWindow w;
w.show();
MainWindow *w = new MainWindow ;
w->show();

这两者的区别:
在C++中生成对象有两种方法,一种是直接用类对象(在内存的stack中),另一种是声明类指针然后new一下(在内存的heap中)。对于前者,在作用范围结束时系统会回收资源,对于后者需要程序员手动回收。
在Qt的Gui编程中,经常会用到QWidget和其子类作为父控件来显示,其上添加有若干控件。在关闭QWidget及其子类窗口时需销毁窗口。
如果是在是定义在stack上,在构造函数中增加:setAttribute(Qt::WA_DeleteOnClose) 以后,会在关闭时出现异常,因为当退出main方法时,会自动销毁窗口,而setAttribute方法会使得Qt再次销毁窗口,造成二次delete,产生报错。
如果定义在heap上,在关闭时main方法不会自动销毁,而Qt会根据setAttribute设置销毁。不会报错。

详细目录 1. 序 2. Qt 简介 3. Hello, world! 4. 信号槽 5. 自定义信号槽 6. Qt 模块简介 7. MainWindow 简介 8. 添加动作 9. 资源文件 10. 对象模型 11. 布局管理器 12. 菜单栏、工具栏和状态栏 13. 对话框简介 14. 对话框数据传递 15. 标准对话框 QMessageBox 16. 深入 Qt5 信号槽新语法 17. 文件对话框 18. 事件 19. 事件的接受与忽略 20. event() 21. 事件过滤器 22. 事件总结 23. 自定义事件 24. Qt 绘制系统简介 25. 画刷和画笔 26. 反走样 27. 渐变 28. 坐标系统 29. 绘制设备 30. Graphics View Framework 31. 贪吃蛇游戏(1) 32. 贪吃蛇游戏(2) 33. 贪吃蛇游戏(3) 34. 贪吃蛇游戏(4) 35. 文件 36. 二进制文件读写 37. 文本文件读写 38. 存储容器 39. 遍历容器 40. 隐式数据共享 41. model/view 架构 42. QListWidget、QTreeWidget 和 QTableWidget 43. QStringListModel 44. QFileSystemModel 45. 模型 46. 视图和委托 47. 视图选择 48. QSortFilterProxyModel 49. 自定义只读模型 50. 自定义可编辑模型 51. 布尔表达式树模型 52. 使用拖放 53. 自定义拖放数据 54. 剪贴板 55. 数据库操作 56. 使用模型操作数据库 57. 可视化显示数据库数据 58. 编辑数据库外键 59. 使用流处理 XML 60. 使用 DOM 处理 XML 61. 使用 SAX 处理 XML 62. 保存 XML 63. 使用 QJson 处理 JSON 64. 使用 QJsonDocument 处理 JSON 65. 访问网络(1) 66. 访问网络(2) 67. 访问网络(3) 68. 访问网络(4) 69. 进程 70. 进程间通信 71. 线程简介 72. 线程和事件循环 73. Qt 线程相关类 74. 线程和 QObject 75. 线程总结 76. QML 和 QtQuick 2 77. QML 语法 78. QML 基本元素 79. QML 组件 80. 定位器 81. 元素布局 82. 输入元素 其他文章 宏定义中的 do {…} while (0) C++:在堆上创建对象,还是在栈上?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值