//2019年最新QT从入门到实战完整版
一、第一个程序
QWidget 父类
QMainWindow & QDialog 子类
QWidget 空窗口
QMainWindow 自带菜单栏、状态栏
QDialog 对话框
【01_FirstProject】main.cpp
//--------------------------------------------------------------------------------------------------------------------------------
include "mywidget.h"
include
//包含一个应用程序类的头文件
int main(int argc, char *argv[])
{
//a: 应用程序对象
//在Qt中,应用程序对象有且只有一个
QApplication a(argc, argv);
//窗口对象 myWidget父类->QWidget
myWidget w;
//窗口对象默认不会显示,必须要调用show方法显示窗口
w.show();
//让应用程序对象进入消息循环机制
return a.exec();
}
//--------------------------------------------------------------------------------------------------------------------------------
【01_FirstProject】01_FirstProject.pro
//--------------------------------------------------------------------------------------------------------------------------------
QT包含的模块
QT += core gui
大于4版本以上 包含QtWidget模块
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
编译完成的exe文件名
TARGET = 01_FirstProject
应用程序模板:application
TEMPLATE = app
DEFINES += QT_DEPRECATED_WARNINGS
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
//--------------------------------------------------------------------------------------------------------------------------------
【01_FirstProject】myWidget.h
//--------------------------------------------------------------------------------------------------------------------------------
ifndef MYWIDGET_H
define MYWIDGET_H
include
//包含QWidget头文件 窗口类
class myWidget : public QWidget //myWidget继承QWidget
{
Q_OBJECT //Q_OBJECT宏 允许类中使用信号和槽的机制
public:
myWidget(QWidget *parent = 0); //构造函数
~myWidget(); //析构函数
};
endif // MYWIDGET_H
//--------------------------------------------------------------------------------------------------------------------------------
命名规范
1.类名 首字母大写 单词和单词之间首字母大写
2.函数名 变量名 首字母小写 单词和单词之间大写
快捷键
注释:Ctrl+/
运行:Ctrl+r
编译:Ctrl+b
查找:Ctrl+f
帮助文档:F1 路径:c:\Qt\Qt5.6.0\5.6\mingw49_32\bin
同名,h和.cpp之间切换 F4
二、按钮的创建
【01_FirstProject】myWidget.cpp
//---------------------------------------------------------------------------------------------------------------------------------
include "mywidget.h"
include
//按钮控件的头文件
- myWidget::myWidget(QWidget *parent)
-
QWidget(parent)
{
//创建一个按钮
QPushButton *btn = new QPushButton;
//btn->show();以顶层方式弹出
//让btn对象以来在myWidget窗口中
btn->setParent(this);
//显示文本
btn->setText("第一个按钮");
//创建第二个按钮
QPushButton *btn2 = new QPushButton("第二个按钮",this);
//移动btn2
btn2->move(200,100);
//设置按钮大小
btn2->resize(100,50);
//重置窗口大小
resize(600,400);
//设置固定窗口大小
setFixedSize(600,400);
//设置窗口标题
setWindowTitle("第一个窗口");
}
myWidget::~myWidget()
{
}
//--------------------------------------------------------------------------------------------------------------------------------
三、对象树
父对象析构同时其所有子对象析构
父对象解构同时其所有子对象解构
四、Qt坐标系
(0,0) → x轴
↓
y轴
五、信号和槽
connect(信号的发出者,发送的具体信号(函数地址),信号的接收者,信号的处理(槽函数)(地址));
connect( myBtn , &QPushButton::clicked , this , &QWidget::close );
信号槽的优点:松散耦合(信号发送端和接收端可以本身没有关联,通过connect()将两端耦合)
【01_FirstProject】myWidget.cpp
//-------------------------------------------------------------------------------------------------------------------------------
include "mywidget.h"
include
//按钮控件的头文件
include "mypushbutton.h"
include
- myWidget::myWidget(QWidget *parent)
-
QWidget(parent)
{
//创建一个按钮
QPushButton *btn = new QPushButton;
//btn->show();以顶层方式弹出
//让btn对象以来在myWidget窗口中
btn->setParent(this);
//显示文本
btn->setText("第一个按钮");
//创建第二个按钮
QPushButton *btn2 = new QPushButton("第二个按钮",this);
//移动btn2
btn2->move(200,100);
//设置按钮大小
btn2->resize(100,50);
//重置窗口大小
resize(600,400);
//设置固定窗口大小
setFixedSize(600,400);
//设置窗口标题
setWindowTitle("第一个窗口");
//创建一个自己的按钮对象
MyPushButton *myBtn = new MyPushButton;
myBtn->setText("我自己的按钮");
myBtn->move(200,200);
myBtn->setParent(this);
//需求 点击我的按钮关闭窗口
//参数1 信号的发送端 参数2 发送的信号 参数3 信号的接收者 参数4 处理的槽函数
connect( myBtn, &QPushButton::clicked, this, &QWidget::close);
}
myWidget::~myWidget()
{
qDebug()<<"myWidget类析构调用";
}
//---------------------------------------------------------------------------------------
自定义信号和槽
【02_SignalsAndSlots】teacher.h
//---------------------------------------------------------------------------------------
ifndef TEACHER_H
define TEACHER_H
include
class Teacher : public QObject
{
Q_OBJECT
public:
explicit Teacher(QObject *parent = nullptr);
//自定义信号写在这个位置
signals:
//返回值是void,只需要声明,不需要实现
//可以有参数,可以重载
void hungry();
public slots:
};
endif // TEACHER_H
//---------------------------------------------------------------------------------------
【02_SignalsAndSlots】teacher.cpp
//---------------------------------------------------------------------------------------
include "teacher.h"
Teacher::Teacher(QObject *parent) : QObject(parent)
{
}
//---------------------------------------------------------------------------------------
【02_SignalsAndSlots】student.h
//---------------------------------------------------------------------------------------
ifndef STUDENT_H
define STUDENT_H
include
class Student : public QObject
{
Q_OBJECT
public:
explicit Student(QObject *parent = nullptr);
signals:
public slots:
// 早期Qt版本槽函数必须写在此位置,高版本可写在全局下任意位置
// 返回值void,需要声明和实现
// 可以有参数,,可以重载
void treat();//在students.cpp里面实现
};
endif // STUDENT_H
//---------------------------------------------------------------------------------------
【02_SignalsAndSlots】student.cpp
//---------------------------------------------------------------------------------------
include "student.h"
include
Student::Student(QObject *parent) : QObject(parent)
{
}
void Student::treat()
{
qDebug()<<"请老师吃饭";
}
//---------------------------------------------------------------------------------------
【02_SignalsAndSlots】widget.h
//---------------------------------------------------------------------------------------
ifndef WIDGET_H
define WIDGET_H
include
include "student.h"
include "teacher.h"
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = nullptr);
~Widget();
private:
Ui::Widget ui;
Teacher zt;
Student* st;
void ClassIsOver();
};
endif // WIDGET_H
//---------------------------------------------------------------------------------------
【02_SignalsAndSlots】widget.cpp
//---------------------------------------------------------------------------------------
include "widget.h"
include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//下课后,老师触发一个信号hungry(),学生相应信号treat()
//创建一个老师对象
this->zt=new Teacher(this);
//创建一个学生对象
this->st=new Student(this);
//建立信号
connect(zt,&Teacher::hungry,st,&Student::treat);
//调用下课函数
ClassIsOver();
}
void Widget::ClassIsOver()
{
//下课函数,调用后触发老师饿了的函数
emit zt->hungry();
}
Widget::~Widget()
{
delete ui;
}
//---------------------------------------------------------------------------------------
重载函数:函数名相同,参数数量、种类不同
编译器会根据所填参数个数、种类选择调用哪一条函数(重载函数优化)
六、信号连接信号
connect(subject, signal1, object, signal2);
disconnect(subject, signal1, object, signal2);
拓展:
1、信号可以连接信号
2、一个信号可以连接多个槽函数
3、多个信号可以连接同一个槽函数
4、信号和槽函数的参数,必须一一对应
5、信号参数可以多于槽函数参数
七、Lambda表达式
Capturemutable -> return-type
{
statement;
};
e.g.
=
{
btn->setText("放学");
}();
//mutable 用于修饰值传递的变量,修改其拷贝而不是本体
connect(myBtn, &QPushButton::clicked, this, [m]()mutable{ m = 100+10; qDebug()<<m;}};
connect(myBtn, &QPushButton::clicked, this, [=](){ qDebug()<< m ;}}
int ret = []() ->int {return 100;}();
connect(myBtn, &QPushButton::clicked, this, [](){emit zt->hungry("宫保鸡丁");});
//优点:可以无参触发有参
八、QMainWindow