qt的学习(1)

1、MinGW与MSVC编译的区别

在进行QT安装时,会有两种编译方式MinGW与MSVC编译

      

MSVC是指微软的VS编译器,这个版本主要用于PC开发,在VS下编译,需要下载VS.
MingGW——主要用于跨平台开发。

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,因此,即便你不去给它复制也没有丝毫的问题。

parent参数指明了组件的父组件,这样,当父组件delete时,Qt可以保证所有子组件——也就是parent指针指向这个组件的所有组件——都会被正确的delete掉。这是Qt能够帮助我们管理一部分内存的原因所在。
Qt是通过遍历parent属性来防止了这一部分内存泄漏的。因此,必要情况下还是不要忘记设置这个parent属性。
当然,如果你不声明这个属性,当整个程序关闭时,操作系统会回收内存——因此我们所说的内存泄漏一般是指我们自己写的应用程序的内部,而不会影响到整个操作系统——当然,如果你实现太可恶,操作系统也会受不了自动关掉你的程序的。

  parent 

Widget(QWidget* parent = nullptr, Qt::WindowFlags f = 0);

自定义窗口类Widget,该类继承自QWidget基类。parent即父窗口,默认为0,即没有父窗口,是顶级窗口。如果指定parent值则当前窗体将会是一个子部件,并且被parent的几何形状所强迫。

 

posted @ 2024-04-01 15:28  taohuaxiaochunfeng  阅读(7)  评论(0编辑  收藏  举报