QT学习笔记(一)

QT学习笔记-2021-1-20

创建项目

1、选择Application->Qt Widget Application创建项目
QT学习笔记(一)

QPushbutton

1、在主mainwindow.cpp文件中引入QPushButton,并在构建函数中创建按钮,创建connect函数使此按钮点击能够关闭主窗口,具体实现方法如下

#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;//创建按钮
    btn->setParent(this);//给按钮设置setParent属性,使其作用在当前作用域下(在窗口上方显示)
    btn->setText("QT第一个按钮");//给按钮设置文字
    QPushButton * btn2 = new QPushButton("QT第二个按钮",this);//第二个按钮
    resize(800,600);//设置主窗口大小
    btn2->move(100,100);//设置按钮坐标,起始坐标(0,0)位于窗口左上角,(X,Y)中X表示横坐标,Y表示纵坐标,
    setWindowTitle("QT的第一个窗口标题"); //设置主窗口标题
    connect(mybutton, &mypushbutton::clicked, this, &MainWindow::close);
}

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

验证QT内存回收机制

1、在Sources下创建 MyButton类,在定义类选项中选择其父类未QWidget(QPushButton的父类是QAbstractButton,而QAbstractButton的父类是QWidget)
QT学习笔记(一)

QT学习笔记(一)
2、在mybutton.h中引入QPushbutton,类定义为QPushbutton类,public中声明析构函数

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

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

public slots:
};  

#endif // MYBUTTON_H

3、在mybutton.cpp文件中实现析构函数与构造函数,并将其类对象改为QPushbutton类

#include "mybutton.h"
#include <QDebug>
MyButton::MyButton(QWidget *parent) : QPushButton(parent)
{
    qDebug()<< "按钮已创建";
}

MyButton::~MyButton(){
    qDebug()<< "按钮内存已释放";
}

4、在主窗口中创建自定义按钮mybutton,然后运行,关闭窗口程序,控制台打印如下图,按钮会随着主程序的关闭而释放内存,效果如下。
QT学习笔记(一)

//mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QPushButton>
#include"mybutton.h"


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QPushButton * btn = new QPushButton;//创建按钮
    btn->setParent(this);//给按钮设置setParent属性,使其作用在当前作用域下(在窗口上方显示)
    btn->setText("QT第一个按钮");//给按钮设置文字
    btn->setFixedSize(100,50);//设置按钮大小,(X,Y),X
    QPushButton * btn2 = new QPushButton("QT第二个按钮",this);//第二个按钮
    resize(800,600);//设置主窗口大小
    btn2->move(100,100);//设置按钮坐标,起始坐标(0,0)位于窗口左上角,(X,Y)中X表示横坐标,Y表示纵坐标,
    setWindowTitle("QT的第一个窗口标题"); //设置主窗口标题
    MyButton * my = new MyButton; //创建自定义按钮
    my->move(100,300);
    my->setText("我自己的按钮");
    my->move(300,0);
    my->setParent(this);
    connect(btn, &QPushButton::clicked, this, &MainWindow::close);
}

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

信号和槽

之前在QPushButton创建的时候有用到connect()函数,该函数的第一个参数是信号发送者,第二个参数是发送的信号,第三个参数是信号的接收者,第四个参数是处理的槽函数。

自定义的信号和槽

1、在资源文件夹中新建teacher与student类,两者都继承QObject类。在student.h文件,在public或public slots中声明槽函数treat()(在QT5.5以下版本只可在public slots中声明)。在student.cpp文件中实现treat()函数。同样的在teacher.h文件中的signals中声明hungry()函数(信号)。

//student.h
#ifndef STUDENT_H
#define STUDENT_H

#include <QObject>

class student : public QObject
{
    Q_OBJECT
public:
    explicit student(QObject *parent = nullptr);

signals:

public slots:
    void treat();
};

#endif // STUDENT_H
//teacher.h
#ifndef TEACHER_H
#define TEACHER_H

#include <QObject>

class teacher : public QObject
{
    Q_OBJECT
public:
    explicit teacher(QObject *parent = nullptr);

signals:
    void hungry();

public slots:
};

#endif // TEACHER_H
//student.cpp
#include "student.h"
#include <QDebug>
student::student(QObject *parent) : QObject(parent)
{

}
void student::treat(){
    qDebug()<< "请老师吃饭";
}
//teacher.cpp
#include "teacher.h"
#include<QDebug>
teacher::teacher(QObject *parent) : QObject(parent)
{

}

2、在主窗口头文件的私有变量中声明student与teacher指针和overclass()函数。MainWindow.cpp文件下测试

//MainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include "teacher.h"
#include "student.h"
#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    student *st;
    teacher *te;
    void overclass();
};

#endif // MAINWINDOW_H

//MainWindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QPushButton>
#include"mybutton.h"


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QPushButton * btn = new QPushButton;//创建按钮
    btn->setParent(this);//给按钮设置setParent属性,使其作用在当前作用域下(在窗口上方显示)
    btn->setText("QT第一个按钮");//给按钮设置文字
    btn->setFixedSize(100,50);//设置按钮大小,(X,Y),X
    QPushButton * btn2 = new QPushButton("QT第二个按钮",this);//第二个按钮
    resize(800,600);//设置主窗口大小
    btn2->move(100,100);//设置按钮坐标,起始坐标(0,0)位于窗口左上角,(X,Y)中X表示横坐标,Y表示纵坐标,
    setWindowTitle("QT的第一个窗口标题"); //设置主窗口标题
    MyButton * my = new MyButton; //创建自定义按钮
    my->move(100,300);
    my->setText("我自己的按钮");
    my->move(300,0);
    my->setParent(this);
    this->st = new student;//在当前域下创建学生对象
    this->te = new teacher;//在当前域下创建老师对象
    connect(btn, &QPushButton::clicked, this, &MainWindow::close);
    connect(te,&teacher::hungry,st,student::treat);
    overclass();
}

MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::overclass(){
    emit te->hungry();
}

测试结果
QT学习笔记(一)

上一篇:QTdesigner布局


下一篇:ios状态栏、导航栏和标签栏的宏定义以及判断是否是全面屏机型