Qt是一个跨平台的C++图形用户界面应用程序框架。
QT特点:
QT5将所有功能模块分为三部分:Qt基本模块(Qt Essentials)、Qt扩展模块(Qt Add-Ons)和开发工具(Qt Tools).
提供了 Qt 在所有平台上的基本功能,是Qt的核心
基本模块简介
实现一些特定功能的提供附加价值的模块,比如下表罗列其中的一些。
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开发更容易、更独立地推进不同的部分。
常用基础窗口类有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;
}
QObject是Qt对象模型的核心。这个模型的核心特性是一个强大的无缝对象通信机制,即信号和槽。
对象树:
QObject是以对象树的形式组织起来的,当创建一个QObject对象时,会看到QObject的构造函数会结构一个QObject指针作为参数(父对象指针)。创建的这个QObject对象会自动添加到其父对象的children()列表。当父类对象析构时候,这个列表中的所有对象也会被析构。
Qt 引入对象树的概念,在一定程度上解决了内存问题。
注意:如果QObject在栈上创建,Qt 保持同样的行为。
以左上角为原点,X轴向右进行增大,Y轴向下进行增大。
注意:嵌套窗口的原点是相对于父窗口而言的。
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include
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;
}