QT之信号和槽

这篇具有很好参考价值的文章主要介绍了QT之信号和槽。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、什么是信号和槽?
我们经常看到的功能,点击一个按钮实现窗口关闭。
这一过程发生了什么?是怎么实现的
QT之信号和槽
按钮相当于一个信号,点击相当于发送一个信号,窗口是个接收者,关闭窗口是个槽函数
信号:各种事件
槽:响应信号的动作

当一个按钮(信号)被触发(发送的信号),某个信号接收到(信号的接收者)就会做出相应的处理动作(槽函数)。他们是怎么建立连接的呢?要想实现这功能我们需要应用到这个api connect()来建立他们四者的关系。

二、connect的实现以及demo实例
1.连接函数 connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));
参数说明:
参数1:信号的发送者
参数2:发送的信号(函数地址)
参数3:信号的接受者
参数4:处理的槽函数(函数的地址)

实现一个按下按钮关闭窗口的demo

#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    //重置窗口大小
   resize(600,400);
    //创建一个按钮
    QPushButton *btn = new QPushButton("按钮",this);
    //设置到对象树中
    btn->setParent(this);
    //移动按钮
    btn->move(100,50);

    //点击我的按钮,关闭窗口
    connect(btn,QPushButton::clicked,this,QWidget::close);

}

Widget::~Widget()
{
    delete ui;
}

2、松散耦合
信号和槽的优点:松散耦合,信号的发送端和接收端本身是没有关联的,通过connect连接,将两端耦合在一起。

三、自定义信号和槽
3.1、自定义信号实现说明
1、写到signal下
2、返回void
3、需要声明,不需要实现
4、可以有参数,可以重载
3.2、自定义的槽函数实现说明
1、返回void
2、需要声明,也需要实现
3、可以有参数,可以重载
4、可以写到public slot下或者public或者全局函数(早期QT版本,必须要写到public slots,高级版本可以写到public或者全局函数)

1.自定义一个信号和槽函数demo实现:下课了,小明触发一个信号,想去打游戏,小张响应信号,一起打王者
//创建两个类,Ming,Zhang  基类是QObject
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    //创建一个小明对象
    this->xm = new Ming;

    //创建一个小张对象
    this->xz = new Zhang;
    connect(xm,Ming::playGame,xz,Zhang::playLol);
    classIsOver();
}
//封装一个下课函数,调用emit触发玩游戏的信号
void Widget::classIsOver()
{
    emit xm->playGame();
}

widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include "zhang.h"
#include "ming.h"
#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private:
    Ui::Widget *ui;
    Ming  *xm;
    Zhang *xz;
    void classIsOver();
};

#endif // WIDGET_H

ming.h
#ifndef MING_H
#define MING_H

#include <QObject>

class Ming : public QObject
{
    Q_OBJECT
public:
    explicit Ming(QObject *parent = 0);

signals:
    void playGame();

public slots:
};

#endif // MING_H

zhang.h
#ifndef ZHANG_H
#define ZHANG_H

#include <QObject>

class Zhang : public QObject
{
    Q_OBJECT
public:
    explicit Zhang(QObject *parent = 0);

signals:

public slots:
    void playLol();
};

#endif // ZHANG_H

zhang.cpp
#include "zhang.h"
#include <QDebug>
Zhang::Zhang(QObject *parent) : QObject(parent)
{

}

void Zhang::playLol()
{
    qDebug()<<"一起打王者";
}


2.自定义带参一个信号和槽函数demo实现:下课了,小明触发一个信号,想去打游戏,小张响应信号,一起打王者,角色是安琪拉

//创建两个类,Ming,Zhang  基类是QObject
widget.cpp
#include <QPushButton>
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    //创建一个小明对象
    this->xm = new Ming;

    //创建一个小张对象
    this->xz = new Zhang;
    //用函数指针传递函数地址
    void(Ming:: *mingSignal)(QString) = Ming::playGame;
    void(Zhang:: *zhangSignal)(QString) = Zhang::playLol;
    connect(xm,mingSignal,xz,zhangSignal);
    classIsOver();
}
//封装一个下课函数,调用emit触发玩游戏的信号
void Widget::classIsOver()
{
    emit xm->playGame("安琪拉");
}

Widget::~Widget()
{
    delete ui;
}


widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include "zhang.h"
#include "ming.h"
#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private:
    Ui::Widget *ui;
    Ming  *xm;
    Zhang *xz;
    void classIsOver();
};

#endif // WIDGET_H

ming.h
#ifndef MING_H
#define MING_H

#include <QObject>

class Ming : public QObject
{
    Q_OBJECT
public:
    explicit Ming(QObject *parent = 0);

signals:
    void playGame(QString roleName);

public slots:
};

#endif // MING_H

zhang.h
#ifndef ZHANG_H
#define ZHANG_H

#include <QObject>

class Zhang : public QObject
{
    Q_OBJECT
public:
    explicit Zhang(QObject *parent = 0);

signals:

public slots:
    void playLol(QString roleName);
};

#endif // ZHANG_H

zhang.cpp
#include "zhang.h"
#include <QDebug>
Zhang::Zhang(QObject *parent) : QObject(parent)
{

}

void Zhang::playLol(QString roleName)
{
    qDebug()<<"一起打王者,角色:"<<roleName.toUtf8().data();
}


**四、QString 转char ***
//QString转char方法:先转成QByteArray(.toUtf8()) .data()再转char

  qDebug()<<"打王者,角色是:"<<roleName.toUtf8().data();
}

五、信号和槽之间的关系

1、信号可以连接信号
2、信号可以连接多个信号
3、一个信号可以连接多个槽
4、多个信号可以连接同一个槽
5、信号和槽的参数一一对应
6、信号和槽的参数个数  是不是要一致?未必,信号的参数个数可以多于槽函数的参数个数

六、Lambda表达式
C++中的Lambda表达式用于定义并创建匿名的函数对象,以简化编程工作。
1.[]标识符 匿名函数
2.= 值传递
3.&引用传递
4.()参数
5.{}实现体
6.mutable修饰值传递变量,可以修改拷贝出的数据,改变不了本体
7.返回值[M]->int []

利用lambda表达式,实现点击按钮关闭窗口的demo文章来源地址https://www.toymoban.com/news/detail-466472.html

#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>
#include <QDebug>
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    resize(600,400);
     //创建一个按钮
     QPushButton *btn = new QPushButton("按钮",this);
     //设置到对象树中
     btn->setParent(this);
     //移动按钮
     btn->move(100,50);

     //点击我的按钮,关闭窗口
     connect(btn,QPushButton::clicked,this,[=](){
         this->close();
         qDebug()<<"窗口关闭";
     });
}

Widget::~Widget()
{
    delete ui;
}

到了这里,关于QT之信号和槽的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 07.QT信号和槽-2

            在Qt中,允许⾃定义信号的发送⽅以及接收⽅,即可以⾃定义信号函数和槽函数。但是对于⾃定义的信号函数和槽函数有⼀定的书写规范。 1.1 自定义信号 (1)⾃定义信号函数必须写到\\\"signals\\\"下; (2)返回值为void,只需要声明,不需要实现; (3)可以有参数,

    2024年04月14日
    浏览(38)
  • 【Qt】信号和槽机制

    目录 一、认识信号和槽 二、connect函数 三、自定义槽函数 四、自定义信号 五、带参数的信号和槽 六、信号和槽断开连接 七、信号和槽存在的意义 八、Lambda表达式定义槽函数 概述 在Qt中,用户和控件的每次交互过程称为一个事件。如\\\"用户点击按钮\\\"是一个事件,\\\"用户关闭窗

    2024年02月22日
    浏览(49)
  • Qt 信号和槽机制

    一. 简介         在Qt中使用信号和槽机制来完成对象之间的协同操作。简单来说,信号和槽都是函数,比如按下窗口上的一个按钮后想要弹出一个对话框,那么就可以将这个按钮的单击信号和我们定义的槽关联起来,在这个槽中可以创建一个对话框,并且显示它。这样,

    2024年01月18日
    浏览(41)
  • [Qt的学习日常]--信号和槽

    前言 作者 :小蜗牛向前冲 名言 :我可以接受失败,但我不能接受放弃   如果觉的博主的文章还不错的话,还请 点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 本期学习:什么是信号和槽,自定义槽函数和信号函数,信号和槽的传参,断开,

    2024年04月28日
    浏览(31)
  • Qt6.2教程——3.Qt信号和槽

    信号和槽是Qt中一个强大的特性,用于处理对象之间的通信。它们是一种事件处理机制,允许一个对象在某个事件发生时通知另一个对象。 定义 : 信号是一个QObject的成员函数,当某个特定事件发生时,它被自动调用。它可以与一个或多个槽关联。 声明 : 在Qt类的声明中,信号

    2024年02月10日
    浏览(52)
  • 02 qt基本控件及信号和槽

    功能:显示一个字符串内容 主要接口函数 构造函数: 赋值运算符重载: 功能函数: 1)基本数据类型(int,float,double,char*)转换成字符串 number(long , int ) : QString number(int , int ) : QString number(uint , int ) : QString number(ulong , int ) : QString number(qlonglong , int ) : QString number(qulonglong , int

    2024年02月12日
    浏览(42)
  • qt信号和槽避免多次连接

    qt同一个信号和槽多次连接,则槽函数 会触发多次 (默认),可能不是我们想要的结果。 有3种方法可以解决这个问题: 因为初始化函数在在整个程序中只运行一次,所以这里面连接信号和槽,就能避免重复连接问题了。 Qt::UniqueConnection 的作用是:如果该信号以前没连接过

    2024年02月10日
    浏览(42)
  • 20221210 QT----信号和槽的使用

    什么是信号(signal) 以QPushButton为例: (1)按下按钮时,会触发一个mousePressEvent事件,此时会发出一个pressed信号; (2)松开按钮时,会触发一个mouseReleaseEvent事件,此时会发出released和clicked信号。 事件的种类有很多,不同的事件都对应着不同的信号,当事件发生时,对应

    2024年02月15日
    浏览(48)
  • Qt快速学习(一)--对象,信号和槽

    目录 1.Qt概述 1.1 什么是Qt 2.2 手动创建 2.3 pro文件 2.4 一个最简单的Qt应用程序        3 第一个Qt小程序 3.1 按钮的创建 3.2 对象模型(对象树)       3.3 Qt窗口坐标体系 4 信号和槽机制         4.1 系统自带的信号和槽 4.2 自定义信号和槽     4.3信号槽的拓展     

    2024年02月12日
    浏览(40)
  • QT基础之——ui文件以及信号和槽机制

            上一节我们讲了除界面文件ui文件其他的所有文件,这一节我们来介绍一下ui文件:在文件目录中我们能看到界面文件这一栏,点击展开我们可以看到一个以\\\".ui\\\"结尾的文件,双击我们会看到如下界面:         我们在右侧选中label和PushButton拖入到工作台上的窗口中,

    2024年04月08日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包