QT(1)

一. 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 下载官网

二. 人生第一个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 采坑记录

说一下这里我踩的坑,跟着视频中的老师敲得,但是我敲得跟老师敲得不大一样,所以出现了问题

首先 在这三个位置:
在这里插入图片描述
我用了匿名对象:
在这里插入图片描述
结果就是程序正常运行,但是槽函数不执行,在这里耽误了好久,最后还是选择老师那种写法,发现问题出在这里
最后测试几次:
第一次: 信号对象 和 发送信号的对象 使用同一对象
在这里插入图片描述
没问题
第二次:信号对象 和 槽 对象 使用同一对象
在这里插入图片描述
不行,
为了验证一下:
第三次测试:
在这里插入图片描述

得出结果:
绑定信号的对象 必须和发送 信号的对象是同一个

猜你喜欢

转载自blog.csdn.net/haiyanghan/article/details/113280119