Qt入门代码

(在b站学习QT,顺便做做笔记 2019年最新QT从入门到实战完整版|传智播客)

1.显示窗口;

myWidget w;            //myWidget 窗口类

w.show;                    //使窗口类对象显示

2.介绍.pro文件部分代码

QT      += core gui                //QT包含的模块

//大于四版本以上的 包含 widget模块

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets                                   

TARGET = untitled1        //目标 生成exe程序的名称

TEMPLATE = app            //模板 应用程序模板 Application

SOURCES += \                //源文件

        main.cpp \

        mainwindow.cpp

HEADERS += \                //头文件

        mainwindow.h   

3.部分常用快捷键

注释    ctrl    +    /

运行    ctrl    +    r

编译    ctrl    +    b

字体缩放    ctrl    +    鼠标滚轮

查找    ctrl    +    f

整行移动    ctrl    +    shift    +    ↑    或者    ↓

帮助文档    F1

同名    .h    与    .cpp    文件快速切换    F4

4.基础UI代码

//QPushButton()共五种重载,可以查看帮助文档对其进行初始化

QPushButton *btn1=new QPushButton;        //创建QPushButton 指针

//btn1.show();        //以顶层方式弹出窗口控件

//设定窗口父对象,this指向当前窗口,可以替换为其他窗口地址 &+对象窗口名

btn1->setParent(this);       

btn1->setText("第一个按钮");        //设定按钮显示文字

btn1->move(100,100);        //移动按钮(x,y),以左上角零点,横为x,竖为y

setWindowTitle("第一个窗口");        //设置窗口标题

resize(600,400);        //重置窗口大小,固定窗口大小,不能进行缩放

5.对象树

QT所有继承于QObject的类的对象在窗口结束时都会自己释放。

每次对应类创建对象都会提供一个Parent指针,也就是父对象指针。当创建QObject对象时,会传一个Parent指针,这相当于每次创建一个QObject对象,可以提供一个父对象。我们创建的对象会自动添加到父对象的children()列表;当父对象析构,其children()列表的所有对象都会析构。

MainWindow::MainWindow(QWidget *parent) :        //parent即为父对象指针

    QMainWindow(parent),

    ui(new Ui::MainWindow)

{

    ui->setupUi(this);

    QPushButton *btn1=new QPushButton();

    //btn1.show();

    btn1->setParent(this);

    btn1->setText("第一个按钮");

    btn1->move(100,100);

    setWindowTitle("第一个窗口");

    resize(9600,5000);

}

将所有对象的析构函数写上qDebug()<<"对象释放";父对象的qDebug先打印,但是其实子对象先释放,等子对象释放完,父对象再释放。

6.信号和槽

//点击按钮关闭窗口

//connect连接信号和槽

// connect(对象1,&对象1的类::对象1里的信号,对象2,&对象2的类::对象2的槽);

connect(btn1,&QPushButton::clicked,this,&MainWindow::close); 

//自定义信号和槽

//类1  teacher类

#ifndef TEACHER_H

#define TEACHER_H

#include

class teacher : public QObject

{

    Q_OBJECT

public:

    explicit teacher(QObject *parent = nullptr);

signals:        //信号都应写再signals后面

    void hungry();        //定义信号,老师饿了,信号不必定义但要声明

public slots:        //老版本的槽都该写在slots后面,新版本不做要求

};

#endif // TEACHER_H

//类2  student类

#ifndef STUDENT_H

#define STUDENT_H

#include

class student : public QObject

{

    Q_OBJECT

public:

    explicit student(QObject *parent = nullptr);

signals:

public slots:

    void treat();        //槽,学生请客函数,槽既要定义也要声明

};

#endif // STUDENT_H


//student 的cpp文件

#include "student.h"

#include

student::student(QObject *parent) : QObject(parent)

{

}

void student::treat()

{

    qDebug()<<"老师饿了,学生请客";

}

//connect写在了窗口类上,这里显示其cpp文件

#include "mainwindow.h"

#include "ui_mainwindow.h"

#include"QPushButton"

#include "QWidget"

#include"teacher.h"

#include"student.h"

MainWindow::MainWindow(QWidget *parent) :

    QMainWindow(parent),

    ui(new Ui::MainWindow)

{

    ui->setupUi(this);

    teacher *tc=new teacher();        //定义teacher的对象指针

    student *st=new student();        //定义student的对象指针

    connect(tc,&teacher::hungry,st,&student::treat);        //连接信号和槽

    emit tc->hungry();        //触发信号

}

MainWindow::~MainWindow()

{

    delete ui;

}

显示结果

7.信号和槽重载

//类 teacher
class teacher : public QObject

{

    Q_OBJECT

public:

    explicit teacher(QObject *parent = nullptr);

signals:

    void hungry();

    void hungry(QString foodname);        //信号hungry重载

public slots:

};

//类 student

class student : public QObject

{

    Q_OBJECT

public:

    explicit student(QObject *parent = nullptr);

signals:

public slots:

    void treat();

    void treat(QString foodname);        //槽treat重载

};

//student.cpp

#include "student.h"

#include

student::student(QObject *parent) : QObject(parent)

{

}

void student::treat()

{

    qDebug()<<"老师饿了,学生请客";

}

void student::treat(QString foodname)

{

    qDebug()<<"老师饿了,学生请客"<

}

//窗口类

#include"student.h"

MainWindow::MainWindow(QWidget *parent) :

    QMainWindow(parent),

    ui(new Ui::MainWindow)

{

    ui->setupUi(this);

    teacher *tc=new teacher();

    student *st=new student();

//    connect(tc,&teacher::hungry,st,&student::treat);

//    emit tc->hungry();

    void(teacher::*teachersignal)(QString)=&teacher::hungry;        //函数指针teachersignal

    void(student::*studentslot)(QString)=&student::treat;                //函数指针studentslot

    connect(tc,teachersignal,st,studentslot);

    emit tc->hungry("宫爆鸡丁");

}


显示结果

8.QString转char*

QString->char*先转成QByteArray(foodname.toUtf8())再转char*

例:foodname.toUtf8().data();

9.信号连接信号

//通过定义按钮,点击按钮触发信号,再引发槽函数

teacher *tc=new teacher();

    student *st=new student();

    void(teacher::*teachersignal)()=&teacher::hungry;

    void(student::*studentslot)()=&student::treat;

    connect(tc,teachersignal,st,studentslot);

    QPushButton *btn=new QPushButton();

    btn->setParent(this);

    btn->setText("触发老师饿");

    btn->resize(60,30);

    btn->move(200,100);

    connect(btn,&QPushButton::clicked,tc,teachersignal);

//拓展

//信号可以连接信号

//一个信号可以连接多个槽函数

//多个信号可以连接一个槽函数

//信号的参数必须大于等于槽函数且类型一一对应

10.Lambda表达式

[](){        //中括号[ ]里=是值传递,&是引用传递;()里是参数

Qdebug<<"这是Lambda表达式"

}();        //不加小括号算声明,加括号算是引用

Lambda表达式多用于信号和槽,引用不同类界面上面的UI,常用=,用等于的时候表达式就可以对界面上的UI进行代码控制。

你可能感兴趣的:(Qt入门代码)