C++——QT之信号与槽

通俗的理解信号与槽

信号与槽(Signal & Slot)是 Qt 编程的基础,也是 Qt 的一大创新。因为有了信号与槽的编程机制,在 Qt 中处理界面各个组件的交互操作时变得更加直观和简单。
信号(Signal)就是在特定情况下被发射的事件,例如PushButton 最常见的信号就是鼠标单击时发射的 clicked() 信号。发射信号使用Qt的emit关键字。QT 的 signals 关键字指出进入了信号声明区,随后即可声明自己的信号。
以上是比较官方的理解方式,但是我们可以通俗的理解为:
信号的存在是为了给槽方法进行通信,传输信息,哪怕不在一个界面。说先将一个槽方法绑定指定的信号,当别的组件需要调用该方法时候,直接调用被绑定的信号即可。
因为信号绑定比较灵活,关联的时候有一对一,一对多,多对一,多对多的关系
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

如下演示的就是一个槽对一个信号的传输:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

signals:
    void comeon(QString &str);      //信号与曹不能实现,也无需实现


private slots:
    void on_WHButton_clicked();

    void iamwuhan(QString &str);


private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

在这里插入代码片
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDebug>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(this,SIGNAL(comeon(QString&)),this,SLOT(iamwuhan(QString&)));
}

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

void MainWindow::on_WHButton_clicked()
{
    QString str="你好武汉!";
    comeon(str);
}

void MainWindow::iamwuhan(QString &str)
{
    qDebug() <<str;
}

在这里插入图片描述
点击这里的武汉的按钮,就会发送“你好武汉!”
先定义一个槽A,定义一个槽B。然后定义一个信号c。
用一个从connect函数关联槽B和信号c。之后槽A调用信号c,就会调用函数
B。

①一个信号连接一个槽:
connect(sender, SIGNAL(single1()), receiver, SLOT(slotFun()));
②一个信号连接一个信号:
connect(sender, SIGNAL(single1()), receiver, SIGNAL(single2()));
③一个信号连接多个槽,关联信号的槽函数按照建立连接时的顺序依次执行:
connect(sender, SIGNAL(single1()), receiver1, SLOT(slotFun()));
connect(sender, SIGNAL(single1()), receiver2, SLOT(slotFun()));
connect(sender, SIGNAL(single1()), receiver3, SLOT(slotFun()));
④多个信号连接一个槽:
connect(sender1, SIGNAL(single1()), receiver, SLOT(slotFun()));
connect(sender2, SIGNAL(single2()), receiver, SLOT(slotFun()));
connect(sender3, SIGNAL(single3()), receiver, SLOT(slotFun()));
⑤ 信号与槽的自动关联:
ui_xxxx.h文件中 connectSlotsByName()方法通过对象名支持信号与槽的自动关联。不采用connect()函数而是采用on_objectName_signal命名方式命名槽达到自动关联的效果。

信号与槽的断开关联:
QObject::disconnect(const QObject* sender,const char* signal,const QObject receiver,const char method);
①断开与一个对象所有的信号的所有关联
disconnect(sender,0,0,0);
等价于:
sender->disconnect();
②断开与一个指定信号的所有关联
disconnect(sender, SIGNAL(single1()), 0, 0);
等价于:
sender->disconnect(SIGNAL(single1()));
③ 断开与一个指定接受者receiver的所有关联
disconnect(sender, 0, receiver, 0);
等价于:
sender->disconnect(SIGNAL(single1()));
④断开指定信号与槽的关联:
disconnect(sender, SIGNAL(single1()), receiver, SLOT(slotFun()));
等价于:
disconnect(myConnection); //myConnection为connect()的返回值

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小生乔克

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

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

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

打赏作者

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

抵扣说明:

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

余额充值