1 QT简介
1.1 跨平台图形界面引擎
1.2 历史
1.3 优点
跨平台
接口简单,容易上手
一定程度上简化了内存回收
1.4 版本
商业版
开源版
1.5 成功案例
linux桌面环境 KDE
谷歌地图
VLC多媒体播放器
2 创建第一个Qt程序
/*QT快捷键*/
注释 ctrl + /
运行 ctrl + r
编译 ctrl + b
字体缩放 ctrl + 鼠标滚轮
查找 ctrl + f
整行移动 ctrl + shift + ↑ 或者↓
帮助文档 F1、工具栏、Assisant程序
自动对齐 ctrl + i
同名之间的.h 和 .cpp切换 F4
- 点击创建项目后,选择项目路径以及给项目起名称。
- 名称 - 不能有中文,不能有空格。
- 路径 - 不能有中文路径。
- 默认创建有窗口类,Mywidget,基类有三种选择:QWidget、QMainWindow、QDialog。
- main函数
int main(int argc, char *argv[])
{
/* a应用程序对象,在QT中,应用程序对象有且只有一个 */
QApplication a(argc, argv);
/* 窗口对象 MyWidget父类 -> QWidget */
MyWidget w;
/* 窗口对象 默认不会显示,必须要调用show方法显示窗口 */
w.show();
/* 让应用程序对象进入消息循环,让代码阻塞在这行*/
return a.exec();
}
3 按钮控件常用API
MyWidget::MyWidget(QWidget *parent)
: QWidget(parent) //初始化列表
{
//创建一个按钮
QPushButton * btn = new QPushButton;
//btn->show(); //show以顶层方式弹出窗口控件
//让btn对象依赖在mywidget
btn->setParent(this);
//显示文本
btn->setText("第一个按钮");
//创建第二个按钮,按照控件大小创建窗口
QPushButton * btn2 = new QPushButton("第二个按钮", this);
//移动btn2按钮
btn2->move(100, 10);
//重置按钮大小
btn2->resize(100, 100);
//重置窗口大小
resize(600, 400);
//设置固定窗口大小
setFixedSize(600, 400);
//设置窗口标题
setWindowTitle("第一个窗口");
}
4 对象树
当创建的对象在堆区时候,如果指定的父亲是QObject派生下来的类或者QObject子类派生下来的类,可以不用管理释放的操作,将对象会放入到对象树种。
一定程度上简化了内存回收机制。
5 坐标系
左上角为(0, 0)点,x以右为正方向,y以下为正方向。
6 信号和槽
- 连接函数。
- 参数:信号的发送者,发送的信号,信号的接受者,处理的槽函数。
- 松散耦合。
- 实现点击按钮->关闭窗口的案例。
- connect(&btn, &QPushButton::clicked, this, &QWidget::close); 。
7 自定义信号和槽
- 自定义信号(返回值void,需要声明需要实现,可以重载,写到signals下)。
- 自定义槽函数(可以有参数,可以重载,写到public slot或者public或者全局函数)。
- 触发自定义的信号:emit。
- 案例:下课后老师触发饿了信号,学生响应信号请客吃饭。
8 自定义信号和槽重载
- 需要利用函数指针,明确指向函数的地址
- void(Teacher::*tSignal)(QString) = &Teacher::hungry;
- QString转char *
- QString.ToUtf8(); => QString转为QByteArray;
- QByteArray.Data(); => QByteArray转为char *
/* Student.h */
#ifndef STUDENT_H
#define STUDENT_H
#include <QObject>
class Student : public QObject
{
Q_OBJECT
public:
explicit Student(QObject *parent = nullptr);
//slot:
//早期QT版本必须写到public slots,高版本可以写到pulic或者全局下
//返回值void,需要声明,也可以实现
//可以有参数,可以发生重载
void treat();
signals:
};
#endif // STUDENT_H
/* Student.cpp */
#include "student.h"
#include <QDebug>
Student::Student(QObject *parent)
: QObject{parent}
{
}
void Student::treat()
{
qDebug() << "Invite the teacher to dinner";
}
/* Teacher.h */
#ifndef TEACHER_H
#define TEACHER_H
#include <QObject>
class Teacher : public QObject
{
Q_OBJECT
public:
explicit Teacher(QObject *parent = nullptr);
signals:
//自定义信号 写到signal下
//返回值是void,只需要声明不需要实现
//可以有参数,可以重载
void hungry();
};
#endif // TEACHER_H
/* Teacher.cpp */
#include "teacher.h"
Teacher::Teacher(QObject *parent)
: QObject{parent}
{
}
/* widget.h */
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include "teacher.h"
#include "student.h"
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private:
void classIsOver();
Ui::Widget *ui;
Teacher * zt;
Student * st;
};
#endif // WIDGET_H
/* widget.cpp */
#include "widget.h"
#include "ui_widget.h"
//Teacher类
//Student类
//下课后,老师会触发一个信号(饿了),学生响应信号(请客吃饭)
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//创建一个老师的对象
this->zt = new Teacher();
//创建一个学生的对象
this->st = new Student();
//老师饿了 学生请客的连接
connect(zt, &Teacher::hungry, st, &Student::treat);
//调用下课函数
classIsOver();
}
Widget::~Widget()
{
delete ui;
}
void Widget::classIsOver()
{
//下课函数,调用后 触发老师饿了的信号
emit zt->hungry();
}