QT学习
QT是一个跨平台的C++图形用户界面应用程序框架。提供建立艺术级图形界面所需的所有功能。完全面向对象的,很容易扩展,并且允许真正的组件编程。
1.创建第一个QT程序
QWidget功能最简单
main.cpp
#include "mywidget.h"
#include <QApplication>//包含一个应用程序类的头文件
//main函数入口 argc命令行变量的数量 argv命令行变量的数组
int main(int argc, char *argv[])
{
//a应用程序对象,在QT中,应用程序对象,有且仅有一个
QApplication a(argc, argv);
//w窗口对象 myWidget父类->QWidget
myWidget w;
//窗口对象 默认不会显示 必须要调用show方法显示窗口
w.show();
//让应用程序对象进入消息循环
//让代码阻塞到这行
return a.exec();
}
.pro文件
#-------------------------------------------------
#
# Project created by QtCreator 2021-02-06T11:16:00
#
#-------------------------------------------------
QT += core gui //QT包含的模块
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets //大于4版本以上 包含widget模块
TARGET = 01_project //目标 生成的.exe名称
TEMPLATE = app //模块 应用程序模板
# The following define makes your compiler emit warnings if you use
# any feature of Qt which has been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
CONFIG += c++11
SOURCES += //源文件
main.cpp
mywidget.cpp
HEADERS += //头文件
mywidget.h
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
mywidget.h
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>//包含头文件 QWidget窗口类
class myWidget : public QWidget
{
Q_OBJECT //宏 允许类中使用信号和槽的机制
public:
myWidget(QWidget *parent = 0);//构造函数
~myWidget();//析构函数
};
#endif // MYWIDGET_H
2.QPushButton创建
第一个按钮
首先添加一个头文件
new一个按钮,并让按钮显示在widget上
可得到如下一个按钮
添加文本
第二个按钮
第二种方式创建按钮
按照控件的大小创建窗口
第二个创建的会将第一个覆盖,所以要移动
固定窗口大小以及修改窗口名字
3.对象树
当创建的对象在堆区域的时候,如果指定的父亲是QObject派生下来的类或者QObject的子类派生下来的类,可以不用管理释放的操作,将对象会放入到对象树中。一定程度上简化了内存回收机制。
验证类的释放操作
新建一个文件
更改成QPushButton为父类:
cpp文件
#include "mypushbutton.h"
#include <QDebug>
MyPushButton::MyPushButton(QWidget *parent) : QPushButton(parent)
{
qDebug()<<"我的按钮类构造调用";
}
MyPushButton::~MyPushButton()
{
qDebug()<<"我的按钮类析构";
}
h文件
#ifndef MYPUSHBUTTON_H
#define MYPUSHBUTTON_H
#include <QPushButton>
class MyPushButton : public QPushButton
{
Q_OBJECT
public:
explicit MyPushButton(QWidget *parent = nullptr);
~MyPushButton();
signals:
public slots:
};
#endif // MYPUSHBUTTON_H
可以看出析构函数可以在关闭窗口时被自动执行
4.QT中的坐标系
以左上角为原点(0,0),X向右增加,Y向下增加。
对于嵌套窗口,其坐标是相对于父窗口而言的。
5.信号和槽
提出需求:点击“我自己的按钮”,关闭窗口
connect(myBtn,&QPushButton::clicked,this,&myWidget::close);
参数1 信号的发送者
参数2 发送的信号(函数的地址)
参数3 信号的接收者
参数4 处理的槽函数(函数的地址)
5.自定义的信号和槽
需求:
设置一个Teacher 老师类 Student 学生类
下课后,老师会触发一个饿了信号,学生响应信号,请客吃饭
添加两个文件
teacher.h
signals:
//自定义信号 写到signals下
//返回值是void,只需要声明,不需要实现
//可以有参数,可以重载
void hungry();
student.h
public slots:
//返回值void,需要声明,也需要实现
//可以有参数,可以发生重载
void treat();
student.cpp
void Student::treat()
{
qDebug()<<"吃饭";
}
widget.cpp
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//创建一个老师对象
this->zt=new Teacher(this);
//创建一个学生对象
this->st=new Student(this);
//连接
connect(zt,&Teacher::hungry,st,&Student::treat);
classisover();
}
void Widget::classisover()
{
emit zt->hungry();
}