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的几何形状所强迫。

 

posted @   taohuaxiaochunfeng  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示

目录导航