qt的学习(1)
1、MinGW与MSVC编译的区别
在进行QT安装时,会有两种编译方式MinGW与MSVC编译
1 | <span class = "pln" >MSVC</span><span class = "pun" >是指微软的</span><span class = "pln" >VS</span><span class = "pun" >编译器,这个版本主要用于</span><span class = "pln" >PC</span><span class = "pun" >开发,在</span><span class = "pln" >VS</span><span class = "pun" >下编译,需要下载</span><span class = "pln" >VS</span><span class = "pun" >.</span><span class = "typ" >MingGW</span><span class = "pun" >——主要用于跨平台开发。</span> |
2、基础理解
(1)
(2)
(3)
(4)
(5)
(6)
3、explicit关键字的理解
在Qt中,explicit 关键字通常用于声明构造函数,以防止隐式类型转换。当一个构造函数被声明为 explicit 时,它将只能被显式调用,而不能进行隐式的类型转换。
- C++中, 一个参数的构造函数(或者除了第一个参数外其余参数都有默认值的多参构造函数),承担了两个角色。一是个构造器,二是个默认且隐含的类型转换操作符。
- 所以,有时候在我们写下如 AAA = XXX, 这样的代码, 且恰好XXX的类型正好是AAA单参数构造器的参数类型,这时候编译器就自动调用这个构造器, 创建一个AAA的对象。
这样看起来好象很酷,很方便。 但在某些情况下,却违背了我们(程序员)的本意。 这时候就要在这个构造器前面加上explicit修饰, 指定这个构造器只能被明确的调用、使用,不能作为类型转换操作符被隐含的使用。
1 class Test1
2 {
3 public:
4 Test1(int n) { num = n; } //普通构造函数
5 private:
6 int num;
7 };
8
9 class Test2
10 {
11 public:
12 explicit Test2(int n) { num = n; } //explicit(显式)构造函数
13 private:
14 int num;
15 };
16
17 int main()
18 {
19 Test1 t1 = 12; //隐式调用其构造函数, 成功
20 Test2 t2 = 12; //编译错误,不能隐式调用其构造函数
21 Test2 t3(12); //显示调用成功
22 return 0;
23 }
Test1的构造函数带一个int型的参数,代码19行会隐式转换成调用Test1的这个构造函数。而Test2的构造函数被声明为explicit(显式),这表示不能通过隐式转换来调用这个构造函数,因此代码20行会出现编译错误。普通构造函数能够被隐式调用。而explicit构造函数只能被显示调用。
4、构造函数的理解
1 MainWindow::MainWindow(QWidget *parent) :
2 QMainWindow(parent),
3 ui(new Ui::MainWindow)
4 {
5
6 ui->setupUi(this);
7 }
1、QMainWindow 是 MainWindow 的父类
2、QWidget *parent 中的 parent 值赋值给 QMainWindow(parent) 中的 parent,这其实是用到C++的语法,执行MainWindow的构造函数前先执行父类QMainWindow的构造函数
3、写这句 QMainWindow(parent) 的原因是 new 一个 MainWindow 对象可以指定父对象,从而使用 Qt 提供的内存自动回收机制
4、QWidget *parent 中为 QWidget 的原因是 QWidget 为窗口类型的类的基类,对于其他父类(比如非QMainWindow,即非窗口类),parent类型是 QObject
5、ui(new Ui::MainWindow)的作用相当于 ui = new Ui::MainWindow,即对对象 ui 进行实例化
几乎所有的Qt类的构造函数都会有一个parent参数。这个参数通常是QObject* 或者是 QWidget* 类型的。很多情况下它都会有一个初始值0,因此,即便你不去给它复制也没有丝毫的问题。
1 | <span class = "pln" >parent</span><span class = "pun" >参数指明了组件的父组件,这样,当父组件</span><span class = "kwd" >delete</span><span class = "pun" >时,</span><span class = "typ" >Qt</span><span class = "pun" >可以保证所有子组件——也就是</span><span class = "pln" >parent</span><span class = "pun" >指针指向这个组件的所有组件——都会被正确的</span><span class = "kwd" >delete</span><span class = "pun" >掉。这是</span><span class = "typ" >Qt</span><span class = "pun" >能够帮助我们管理一部分内存的原因所在。</span><span class = "typ" >Qt</span><span class = "pun" >是通过遍历</span><span class = "pln" >parent</span><span class = "pun" >属性来防止了这一部分内存泄漏的。因此,必要情况下还是不要忘记设置这个</span><span class = "pln" >parent</span><span class = "pun" >属性。当然,如果你不声明这个属性,当整个程序关闭时,操作系统会回收内存——因此我们所说的内存泄漏一般是指我们自己写的应用程序的内部,而不会影响到整个操作系统——当然,如果你实现太可恶,操作系统也会受不了自动关掉你的程序的。</span> |
parent
Widget(QWidget* parent = nullptr, Qt::WindowFlags f = 0);
自定义窗口类Widget,该类继承自QWidget基类。parent即父窗口,默认为0,即没有父窗口,是顶级窗口。如果指定parent值则当前窗体将会是一个子部件,并且被parent的几何形状所强迫。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律