(在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("宫爆鸡丁"); } QString->char*先转成QByteArray(foodname.toUtf8())再转char* 例:foodname.toUtf8().data(); //通过定义按钮,点击按钮触发信号,再引发槽函数 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); //拓展 //信号可以连接信号 //一个信号可以连接多个槽函数 //多个信号可以连接一个槽函数 //信号的参数必须大于等于槽函数且类型一一对应 [](){ //中括号[ ]里=是值传递,&是引用传递;()里是参数 Qdebug<<"这是Lambda表达式" }(); //不加小括号算声明,加括号算是引用 Lambda表达式多用于信号和槽,引用不同类界面上面的UI,常用=,用等于的时候表达式就可以对界面上的UI进行代码控制。8.QString转char*
9.信号连接信号
10.Lambda表达式