1.1 什么是QT?
Qt是一个跨平台的C++图形用户界面应用程序框架。
QT特点:
- 跨平台,几乎支持所有的平台
- 接口简单,容易上手,学习QT框架对学习其他框架有参考意义。
- 一定程度上简化了内存回收机制
- 开发效率高,能够快速的构建应用程序。
- 有很好的社区氛围,市场份额在缓慢上升。
- 可以进行嵌入式开发。
1.2 QT5模块架构
QT5将所有功能模块分为三部分:Qt基本模块(Qt Essentials)、Qt扩展模块(Qt Add-Ons)和开发工具(Qt Tools).
1.2.1 Qt基本模块
提供了 Qt 在所有平台上的基本功能,是Qt的核心
基本模块简介
1.2.2 Qt扩展模块
实现一些特定功能的提供附加价值的模块,比如下表罗列其中的一些。
1.3 Qt5架构主要特点
Qt5对Qt4的模块进行重构,最明显是对Qt Gui模块的修改。在Qt5中,所有图形界面程序需要的QApplication以及最重要的基类QWidget已经不在Qt Gui模块,而是被组合到Qt Widgets中。
Qt5图形界面库的整体架构
主要特点:
1)简化移植——全部的Qt接口迁移到Qt平台抽象层(Qt Platform Abstraction, QPA)上,使Qt能更容易迁移到别的系统和设备上;
2)轻量整合——Qt5为Qt Quick基于OpenGL的场景图引入了全新的图形架构,新版本的Qt Gui包含了一组QOpenGL类,同时引入了更轻量级的QGuiApplication和一个处理屏幕上顶层窗口类QWindow;
3)灵活结构——模块化使Qt开发更容易、更独立地推进不同的部分。
1.4 基础窗口类
常用基础窗口类有3个,QWidget,QDialog,QMainWindow
1)QWidget类是所有用户界面对象的基类,被称为基础窗口部件。QWidget继承自QObject类和QPaintDevice类,其中QObject类是所有支持Qt对象模型的基类,QPaintDevice类是所有可以绘制的对象的基类。可内嵌到其他窗口中,无边框;可不内嵌单独显示,独立窗口有边框;
2)QDialog类是所有对话框窗口类的基类。对话框窗口时一个经常用来完成一个小任务或者和用户进行简单交互的顶层窗口,不能内嵌到其他窗口。按照运行对话框时是否还可以和该程序的其他窗口进行交互分为两类:模态和非模态。
3)QMainWindow有工具栏(可以有多个)、状态栏(仅一个)、菜单栏(仅一个),不能内嵌到其他窗口中。
说明:
1)内嵌窗口依附于一个大窗口,作为大窗口(父窗口)的一部分;
2)非内嵌窗口有边框,有标题栏,需要调用函数才能显示。
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "testwidget.h"
#include "testdialog.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) //窗口被实例化,可供展示
{ui->setupUi(this); //两个同名类对象绑定到一起//一般在qt的构造函数中进行初始化操作(窗口,数据,...)//显示当前窗口时,显示另外一个窗口TestWidget
#if 1//创建窗口对象,没有给w对象指定父类对象,这个窗口是独立窗口//要显示这个窗口必须show,有边框,无内嵌TestWidget* w = new TestWidget;w->show();#else//创建窗口对象,给w对象指定父类对象,不是独立窗口,内嵌//这样的话当前父窗口显示的时候,子窗口一并显示出来//子窗口无边框//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);//模态,阻塞程序的执行,不能进行焦点窗口切换dlg->exec();
#endif}MainWindow::~MainWindow()
{delete ui;
}
1.5 QObject
QObject是Qt对象模型的核心。这个模型的核心特性是一个强大的无缝对象通信机制,即信号和槽。
对象树:
QObject是以对象树的形式组织起来的,当创建一个QObject对象时,会看到QObject的构造函数会结构一个QObject指针作为参数(父对象指针)。创建的这个QObject对象会自动添加到其父对象的children()列表。当父类对象析构时候,这个列表中的所有对象也会被析构。
Qt 引入对象树的概念,在一定程度上解决了内存问题。
- 当一个QObject对象在堆上创建的时候,Qt 会同时为其创建一个对象树。不过,对象树中对象的顺序是没有定义的。这意味着,销毁这些对象的顺序也是未定义的。
- 任何对象树中的 QObject对象 delete 的时候,如果这个对象有 parent,则自动将其从 parent 的children()列表中删除;如果有孩子,则自动 delete 每一个孩子。Qt 保证没有QObject会被 delete 两次,这是由析构顺序决定的。
注意:如果QObject在栈上创建,Qt 保持同样的行为。
1.6 Qt坐标
以左上角为原点,X轴向右进行增大,Y轴向下进行增大。
注意:嵌套窗口的原点是相对于父窗口而言的。
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPushButton>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);this->move(100, 100);//创建第一个按钮,让这个按钮作为当前创建的子控件QPushButton* btnA = new QPushButton(this);//移动按钮的位置btnA->move(10, 10);//给按钮设置固定大小btnA->setFixedSize(200, 200);//创建第二个按钮,让这个按钮作为当前创建的子控件QPushButton* btnB = new QPushButton(btnA);//移动按钮的位置btnB->move(10, 10);//给按钮设置固定大小btnB->setFixedSize(100, 100);//创建第三个按钮,让这个按钮作为当前创建的子控件QPushButton* btnC = new QPushButton(btnB);//移动按钮的位置btnC->move(10, 10);//给按钮设置固定大小btnC->setFixedSize(50, 50);
}MainWindow::~MainWindow()
{delete ui;
}