qt学习

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();
}
posted @ 2021-03-05 16:10  20209301黄宇欣  阅读(133)  评论(0编辑  收藏  举报