Qt:一个自定义的信号槽例子-详细的代码注释

13 篇文章 0 订阅

报纸和订阅者的例子

newspaper.h

#ifndef NEWSPAPER_H
#define NEWSPAPER_H

#endif // NEWSPAPER_H
#include <QObject>  //Qt对象基类

class Newspaper : public QObject    //Newspaper类继承了Qt对象基类,只有继承了QObject才有信号槽的能力。
{
    Q_OBJECT    //但凡是QObject类(间接或直接子类),都应该在第一行写Q_OBJECT(宏),Q_OBJECT提供信号槽机制以及国际化机制等。
public:
    Newspaper(const QString & name) : m_name(name){
    }

    void send(){
        emit newPaper(m_name);  //让C++发射信号(emit)来触发QT槽以刷新进度条
    }   //emit是Qt中的关键字,其实也是一个宏。含义:发出,也就是发出newPaper信号。感兴趣的接受者会关注这个信号。
    //那个报纸发出的信号?即参数m_name
    //接收者也就是通过这个槽函数获得实际值。进而完成数据从发出者到接收者的转移

signals:    //为该类添加的信号(其实就是函数名)
    void newPaper(const QString &name); //不需要具体实现,参数是该类需要让外界知道的数据

private:
    QString m_name;
};

reader.h

#ifndef READER_H
#define READER_H

#endif // READER_H
#include <QObject>
#include <QDebug>
//读者类,用于接收信号的。
class Reader : public QObject{
    Q_OBJECT    //  槽机制 必备的宏

public:
    Reader(){}  //  默认构造函数

    void receiveNewspaper(const QString & name){    //  槽函数必须自己实现代码。(就是普通的成员函数)。正常都是public权限的,如果是private,外界访问不到,就没有意义了。
        qDebug()<<"Receives Newspaper:"<<name;
    }
};

main.cpp

#include "mainwindow.h"
#include <QApplication>
#include "newspaper.h"
#include "reader.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    Newspaper newspaper("Newspaper A");//Newspaper类对象
    Reader reader; //读者reader类对象
    QObject::connect(&newspaper,&Newspaper::newPaper,&reader,&Reader::receiveNewspaper);	//使用QObject::connect()函数连接信号和槽
    newspaper.send();	//调用Newspaper类函数

    return app.exec();  //程序进入消息循环,等待对用户输入进行响应。即main()函数把控制权转移给了Qt
    //在exec()中,Qt接受并处理用户和系统的事件并且把它们传递给适当的窗口部件
}

在这里插入图片描述

总结

  • 发送者和接收者都需是QObject的子类(槽函数是全局函数、Lambda表达式等无需接收者情况除外)
  • 使用signals标记信号函数,信号是一个函数声明,返回void,不需要实现函数代码。但是槽函数需要具体的实现。
  • 槽函数是普通的成员函数,作为成员函数,会受到public、private、protected的影响
  • 使用emit在恰当位置发送信号
  • 使用QObject::connect()函数连接信号和槽
  • 任何成员函数、static函数、全局函数和Lambda表达式都可以作为槽函数。

扩展

  • 信号可以和多个槽相连接,但是槽的调用顺序不确定
  • 多个信号可以连接到一个槽,任意一个信号发出,这个槽就能被调用。
  • 一个信号可以连接到另外一个信号:当第一个信号发出时,第二个信号被发出。
  • 槽可以被取消连接
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

asjodnobfy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值