(一)QT的第一个入门小程序

  1. 项目的文件结构
    在这里插入图片描述

  2. 工程类文件 0708day08.pro

#-------------------------------------------------
#
# Project created by QtCreator 2021-07-08T10:11:34
#
#-------------------------------------------------
#QT包含的模块,目前来看主要包含了两个模块
QT       += core gui
#要判定QT的版本,如果版本大于4 则加入这个模块
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
#编译生成的exe文件的名称,在编译文件中可以看到
#我的文件路径为:E:\QtProjects\build-0708day08-#Desktop_Qt_5_9_0_MinGW_32bit-Debug\debug\XXX.exe
TARGET = 0708day08
#应用程序模板
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which as 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

#源文件
SOURCES += \
        main.cpp \
        mainwindow.cpp
#头文件
HEADERS += \
        mainwindow.h
#界面文件
FORMS += \
        mainwindow.ui

  1. 头文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    //宏,允许类中使用信号和槽
    Q_OBJECT

public:
    //构造函数
    explicit MainWindow(QWidget *parent = 0);
    //析构函数
    ~MainWindow();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H
  1. 源文件
#include "mainwindow.h"
#include "ui_mainwindow.h"
//编程小Tips
//类名 首字母大写 单词之间首字母大写
//函数名 变量名 首字母小写
//快捷键
// 注释 ctrl + / 
// 运行 ctrl + r 
// 编译 ctrl + b 
// 对齐 ctrl + i
// f1帮助界面  esc 退出  或者在目录D:\QT\Qt5.9\5.9\mingw53_32\bin 使用帮助文档
//自动对齐  ctrl + i
//.h(头文件) 和.cpp(源文件)文之间的切换使用f4按钮
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

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

  1. 创建一个按钮
  • 在帮助文档中查询相关信息
    在这里插入图片描述

  • 阅读帮助文档

在这里插入图片描述
得知:需要引入的头文件的名称,需要的模块,父类及其子类关系

  • 创建按钮(方式一)
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPushButton>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //创建一个按钮
    QPushButton * btn = new QPushButton;
    //show以顶层方式弹出,需要让btn依赖mywidget
    btn->setParent(this);
    //显示文本
    btn->setText("第一个按钮");
    btn->resize(100,50);
}

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

这里的三行代码
首先需要创建按钮,之后需要让按钮显示出来,使用show方法会让按钮以顶层窗口的方式弹出,这里采用设置按钮的依赖对象,然后设置按钮的显示文本,即可运行
在这里插入图片描述

  • 创建按钮(方式二)
//三句话,合并成一句话
QPushButton * btn = new QPushButton("第二个按钮",this);
//补充
    //设置固定窗口大小
    setFixedSize(600,400);
    //设置窗口标题
    setWindowTitle("第一个窗口");
  • 创建的按钮中文可能出现乱码的情况
    在这里插入图片描述
    在这里插入图片描述
    修改之后,保存即可。
  1. 对象树
    在Qt中创建对象的时候会提供一个Parent对象指针,在创建QObject对象时,可以提供一个其父对象,我们创建的这个QObject对象会自动添加到其父对象的children()列表。当父对象析构的时候,这个列表中的所有对象也会被析构。(注意,这里的父对象并不是继承意义上的父类!)任何对象树中的 QObject对象 delete 的时候,如果这个对象有 parent,则自动将其从 parent 的children()列表中删除;如果有孩子,则自动 delete 每一个孩子。
  • 创建自定义按钮类
    通过在项目上右击,添加新文件,选择添加c++class,设置头文件和源文件 自动生成
    在这里插入图片描述
  • 头文件编写构造和析构函数声明,源文件编写构造和析构函数具体细节

mypushbutton.h 头文件

#ifndef MYPUSHBUTTON_H
#define MYPUSHBUTTON_H
#include <QPushButton>
#include <QWidget>

class MyPushButton : public QPushButton
{
    Q_OBJECT
public:
    explicit MyPushButton(QWidget *parent = nullptr);
    ~MyPushButton();
    signals:

public slots:

};

#endif // MYPUSHBUTTON_H

mypushbutton.cpp 源文件

mypushbutton.cpp

mypushbutton.cpp 源文件

#include "mypushbutton.h"
#include <QPushButton>
#include <QDebug>
MyPushButton::MyPushButton(QWidget *parent) : QPushButton(parent)
{
    qDebug()<<"我的按钮类的构造调用";
}

MyPushButton::~MyPushButton(){
    qDebug()<<"我的按钮类的析构调用";
}


  • 加入至对象树
    在mainwindow.cpp中引入自定义的按钮类,相当于加入到children中
      MyPushButton * mbtn = new MyPushButton();
      mbtn->setParent(this);
      mbtn->setText("我自己的按钮");
      mbtn->resize(50,30);
  • 测试运行效果
    在这里插入图片描述
    这个看起来好像是mainwindow先析构,然后才是自己创建的按钮类的析构。事实上,只是先执行了qdebug的那行话,然后查询mainwindow下的所有子对象,分别进入,进入后依旧先执行打印一句话,判别我的按钮类下面还有没有子对象,如果没有的话就执行析构,然后再返回上一层。这个类似于树的递归遍历!
posted @ 2021-07-09 14:01  我就是隔壁老张  阅读(470)  评论(0编辑  收藏  举报