一. QT介绍
Qt是一个针对桌面、嵌入式、移动设备的一个跨平台的应用程序开发框架,支持的平台包括Linux、OS X、Windows、VxWorks、QNX、Android、iOS、BlackBerry(黑莓)、Sailfish OS(旗鱼操作系统)等。
Qt是基于C++编写的框架,它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。预处理器,MOC(全称:Meta-Object Compiler-元对象编译器)用于扩展C++,如:信号和槽的特性。在编译之前,先使用MOC分析Qt扩展的C++源文件(检测是否包含Q_OBJECT宏),然后生成符合C++标准的源文件(新文件名将会由moc_加上原文件名构成)。因此框架本身和应用程序/库使用它能被任何符合标准C++的编译器(像Clang、GCC、 ICC、MinGW 和MSVC)所编译。
1.1 下载安装
二. 人生第一个QT程序
2.1 项目目录
2.2 测试,运行空项目
2.3 添加代码
myfirstqt.cpp
#include "myfirstqt.h"
#include "QPushButton"
MyFirstQt::MyFirstQt(QWidget *parent)
: QMainWindow(parent)
{
QPushButton * btn = new QPushButton("按钮1",this);
// 窗口大小
this->resize(600,400);
// 固定窗口大小
// this->setFixedSize(600,400);
// 窗口标题
this->setWindowTitle("窗口标题");
// 按钮大小
btn->resize(200,100);
// 按钮位置
btn->move(200,200);
}
MyFirstQt::~MyFirstQt()
{
QPushButton p;
}
2.4 运行结果:
三. 信号和槽
GUI 程序除了要绘制控件,还要响应系统和用户事件,例如重绘、绘制完成、点击鼠标、敲击键盘等。当事件发生时,UI 会产生相应的变化,让用户直观地看到
大部分编程(例如Win SDK、Web前端)中使用回调函数来响应事件,而 Qt 却独创了信号和槽机制
所谓回调函数,就是程序员提前定义一个函数,当事件发生时就调用该函数
3.1 基本案例
基于上面代码,实现点击按钮关闭窗口
// 连接信号 和 槽
// 所谓的连接,就是当信号执行时,触发槽函数
// 下面这个代码就是连接 按钮的点击事件,然后就是触发窗口的关闭
connect(btn,&QPushButton::clicked,this,&MyFirstQt::close);
3.2 自定义信号 和 槽
上面那个案例是 qt 提供给我们的 槽函数
下面创建一个自定义槽函数
需求:每点击一次按钮 ,控制台输出一次点击次数
3.2.1 在项目中创建 自定义槽 类
3.2.2 在自定义槽 类中定义 槽函数
#ifndef CUSTOMSLOT_H
#define CUSTOMSLOT_H
#include <QObject>
class Customslot : public QObject
{
Q_OBJECT
public:
explicit Customslot(QObject *parent = 0);
int cout; // 定义一个变量记录次数
signals:
// 信号
// 信号只需要声明,不需要实现
// 信号可以有参数,可以发生重载
// 信号函数 返回值 void
public slots:
// 槽
// 槽需要实现
// 槽可以有参数,可以发生重载
// 槽函数 返回值 void
void addClickCount();
};
#endif // CUSTOMSLOT_H
实现该槽函数:
customslot.cpp
#include "customslot.h"
#include <QDebug> // 控制台输出需要包含这个头文件
Customslot::Customslot(QObject *parent) : QObject(parent)
{
}
void Customslot::addClickCount()
{
qDebug() << "按钮被点击" << ++this->cout << "次";
}
3.3.3 连接信号 和 槽
// 连接信号 和 槽
// 所谓的连接,就是当信号执行时,触发槽函数
// 下面这个代码就是连接 按钮的点击事件,然后就是触发窗口的关闭
Customslot * slot = new Customslot(this); // this指的是父类,这样会由qt的对象树管理该对象,自动回收
connect(btn,&QPushButton::clicked,slot,&Customslot::addClickCount);
3.3.4 运行结果
3.3 有参信号和槽
在Qt的开发过程中,信号带参数是很常见的,在使用带参数的信号槽时,有以下几点需要注意
- 当信号和槽函数的参数数量相同时,它们的参数类型要完全一致
- 当信号的参数与槽函数的参数数量不同时,只能是信号的参数数量多于槽函数的参数数量,且前面相同数量的参数类型应一致,信号中多余的参数会被忽略
- 在不进行参数传递时,信号槽绑定也是要求信号的参数数量大于等于槽函数的参数数量,这种情况一般是一个带参数的信号去绑定一个无参数的槽函数
3.3.1首先在MyFirstQt 中定义一个成员参数
3.3.2 初始化成员参数
3.3.3 构建有参信号函数
3.3.4 有参槽函数
3.3.5 实现 槽函数
3.3.6 声明发送信号的函数
3.3.7 实现发送信号的函数
3.3.7 连接 信号 和 槽
3.3.8 运行结果
3.3.10 QString输出不正确
这里需要 QString 先通过toUtf8()
转成QByteArray 再通过 data()
转成 char *
3.3.11 采坑记录
说一下这里我踩的坑,跟着视频中的老师敲得,但是我敲得跟老师敲得不大一样,所以出现了问题
首先 在这三个位置:
我用了匿名对象:
结果就是程序正常运行,但是槽函数不执行,在这里耽误了好久,最后还是选择老师那种写法,发现问题出在这里
最后测试几次:
第一次: 信号对象 和 发送信号的对象 使用同一对象
没问题
第二次:信号对象 和 槽 对象 使用同一对象
不行,
为了验证一下:
第三次测试:
得出结果:
绑定信号的对象 必须和发送 信号的对象是同一个