[SingleSele]QT入门学习笔记

//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

猜你喜欢

转载自www.cnblogs.com/SingleSele/p/12576333.html
今日推荐