基本Qt程序的创建

参考这篇博文

main.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
// 应用程序类,在一个Qt应用程序中,该对象只有一个
QApplication a(argc, argv);
// 窗口对象
MainWindow w;
// 显示窗口
w.show();
// 阻塞函数,程序进入了事件循环
return a.exec();
}

mainwindow.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui {
// 对应的是ui文件中的MainWindow类,与下面的类不同
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow // 继承Qt的标准窗口类
{
Q_OBJECT

public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();

private:
Ui::MainWindow *ui; // 定义指针指向窗口的UI对象
};
#endif // MAINWINDOW_H

mainwindow.cpp

testwidget.htestwidget.h实现略。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "testwidget.h"
#include "testdialog.h"

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow) // 基于mainwindow.ui创建一个实例对象
{
// 将mainwindow.ui的实例对象和 当前类的对象进行关联
// 这样同名的连个类对象就产生了关联, 合二为一了
ui->setupUi(this);

// 一般在Qt的构造函数中进行初始化操作:窗口、数据等
// 显示当前窗口的时候,显示另外一个窗口TestWidget

// 创建窗口对象,若没有给w对象指定父对象,这个窗口就是一个"独立"窗口
// 这时要显示这个独立窗口就必须要进行show操作
#if 1
TestWidget *w = new TestWidget;
// 显示当前窗口
w->show();
# else
// 注意:explicit TestWidget(QWidget *parent = nullptr);
// 多态
// 而如果创建一个窗口对象的时候给其指定了父对象,这个窗口就不是一个独立窗口了
// 这样的话当前父窗口显示的时候,子窗口就一并被(内嵌地)显示出来了
// 这时候子窗口是没有边框的
TestWidget *w = new TestWidget(this);
#endif

#if 0
// 创建对话框窗口
TestDialog *dlg = new TestDialog(this);
// 非模态显示的方式
dlg->show();
#else
// 创建对话框窗口
TestDialog *dlg = new TestDialog(this);
// 模态显示的方式:exec()
// 会阻塞程序的执行
dlg->exec();
#endif

}

MainWindow::~MainWindow()
{
delete ui;
}

Qt的坐标体系

mainwindow.cpp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPushButton>

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);

//每个窗口使用父窗口的坐标系

this->move(120, 240);

// 创建第一个按钮,让这个按钮作为当前创建的子控件
QPushButton *btnA = new QPushButton(this);
// 移动按钮的位置
btnA->move(10, 40);
// 给按钮设置固定大小
btnA->setFixedSize(200, 200);

// 创建第二个按钮,让这个按钮作为当前创建的子控件
QPushButton *btnB = new QPushButton(btnA);
// 移动按钮的位置
btnB->move(50, 20);
// 给按钮设置固定大小
btnB->setFixedSize(100, 100);

// 创建第三个按钮,让这个按钮作为当前创建的子控件
QPushButton *btnC = new QPushButton(btnB);
// 移动按钮的位置
btnC->move(25, 25);
// 给按钮设置固定大小
btnC->setFixedSize(50, 50);
}

MainWindow::~MainWindow()
{
delete ui;
}

Qt内存回收

Qt中有内存回收机制, 但是不是所有被new出的对象被自动回收, 满足条件才可以回收, 如果想要在Qt中实现内存的自动回收, 需要满足以下两个条件:

  • 创建的对象必须是QObject类的子类(间接子类也可以);
  • 创建出的类对象, 必须要指定其父对象是谁(通过构造函数或setParent()方法)。