Qt:信号与槽机制

之前写按钮的信号槽,都是直接转到槽的。昨天在写计网课设的时候,自己写了一个信号槽,于是就记录一下。
声明:本章大部分内容及思想均来自于博客:C++面试题之 QT信号和槽实现机制

一、信号与槽机制基本介绍

所谓信号槽,实际就是观察者模式。

当某个事件发生之后(比如button检测到自己被点击了一下),它可以利用emit发出一个信号signal。此时的发送是没有目的的,可以理解为广播信号。

如果有对象对这个signal感兴趣(比如说这个对象需要在这个事件发生时,进行某些操作),它就可以定义一个槽slot,并用connect函数与signal进行绑定。

绑定后,当信号发出时,被连接的槽函数会自动被回调。

1. 槽函数

槽函数本质是类成员函数,唯一的区别就是:槽函数slot可以与信号signal连接在一起。

2. 说明

(1)只有继承了QObject类的类,才具有信号槽的能力
凡是QObject类或其子类,都需要在类定义的第一行加上语句Q_OBJECT。比如:
在这里插入图片描述

(2)信号函数的参数类型必须与槽函数的参数类型一致,且个数必须大于等于槽函数的参数个数

(3)connect函数用法
在进行的地方写如下语句:

QObeject::connect(<sender>, <&Send::signal>, <receiver>, <&Receiver::slot>);

其中,

  • sender:发送方指针,即发生事件的对象的指针
  • &Send::signal:发送方的信号函数signal
  • receiver:接收方指针,即对发送方信号感兴趣的对象的指针
  • &Receiver::slot:接收方的槽函数slot

图示:
在这里插入图片描述

二、举例说明

在本次计网课设中,我需要实现的功能是:一个线程在启动之后,会输出一些信息到界面上。

1. 分析

  • sender:该线程可以看成sender
  • &Send::signal:“线程将信息广播发送出去”这个事件可以看成是signal
  • receiver:界面可以看成receiver
  • &Receive::slot:将信息输出到界面可以看成是slot

2. 实现

假设sender类、receiver类分别为MyThreadReceiveWindow
(1)发送方头文件:mythread.h
在这里插入图片描述
(2)发送方源文件:mythread.cpp
线程启动之后,会自动调用run()函数。所以需要在run()中通过emit发出信号。下面只给出部分代码

void MyThread::run()
{
	...
	QString info = "-------------- The information of Packet " + QString::number( ++ cnt, 10) + " --------------";
	emit sendMessage(info); // 此时,就会发送信号
}

(3)接收方头文件:receivewindow.h
在这里插入图片描述

(4)接收方源文件:receivewindow.cpp
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值