QT学习2:信号与槽的初步理解(signal and slot)

本文深入探讨了Qt框架中的信号与槽机制,解释了如何利用这一机制实现对象间的通信,包括信号发射、槽函数接收及connect函数的使用,旨在帮助读者理解并掌握GUI程序中的事件处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

信号与槽不仅可以处理GUI上发生的事件,也可以实现对象间的数据通信。是一种高级接口。
为了用户在GUI程序中点击按钮控件时可运行指定函数,信号与槽提供可运行指定函数的框架。所有从QObject或其子类(例如Qwidget)派生的类都能够包含信号和槽。
当对象改动其状态时,信号就由该对象发射(emit)出去,这就是对象所要做的全部事情,他不知道另一端是谁在接收这个信号。这就是真正的信息封装,他确保对象被当作一个真正的软件组件来使用。槽用于接收信号,但他们是普通的对象成员函数。一个槽并不知道是否有所有信号和自己相连接。而且,对象并不了解具体的通信机制。

1 Q_OBJECT

Q_OBJECT是一个宏。在类中,只有加入了Q_OBJECT,才能使用QT中的signalslot机制。所以,为了使用信号槽,必须继承QObject,都应该在第一行代码写上Q_OBJECT。不管是不是使用信号槽,都应该添加这个宏。

class VVCAnalyzer : public QMainWindow
{
	Q_OBJECT
	......
}

2 signals

signals是qt里的关键字。信号是对GUI进行的操作。如鼠标单击、双击、经过按钮等,都可认为是信号,此外,还可以自己对信号进行定义。信号用于发射,代码中用signals关键字指出进入了信号声明区,如下:

signals: 
	......

随后即可声明自己的信号,信号和C++的函数不同之处在于:信号没有函数体定义,返回类型都是void,进而应该进行槽的定义。

3 slots

slots是qt里的关键字。槽用于接收信号,如告诉程序:鼠标点击后应该如何做。他们是普通的对象成员函数,在类中定义成员函数时加上slots即可完成。这里可用于声明。槽声明区如下:

public slots:
	......

在槽声明区下,应当声明槽函数来声明他们所要完成的操作。槽也提供多种虚函数,可重写并使用提供的虚函数。

4 connect

connect是一个函数。这个函数将某个对象的信号和另外一个对象的槽函数相关联。例如,当我用鼠标点了某个按钮,这个按钮发出一个信号signal,这时就是通过connect这个桥梁,告诉对应的slot,于是调用点击这个按钮对应的成员函数完成了这一系列操作。connect的函数声明如下:

bool QObject::connect (const QObject *sender,const char*signal,const char *method,Qt;:ConnectionType type=Qt:;Autoconnection)const

我们可以把信号槽绑定认为是如下:

connect(this, SIGNAL(iSignal(int)), this, SLOT(iSlot(int)));

在码流分析软件中,我们可以用于判断是否进行绑定的方式如下:

	if(!connect(ui.btOpenFile, SIGNAL(clicked(bool)), this, SLOT(action_OpenFile())))
	{ 
		qDebug() << "link error";
		return;
	}

其中,ui.btOpenFile是进行界面设计时的“打开文件”按钮,经过SIGNAL(clicked(bool)),也就是是否点击了这个按钮,得到SLOT(action_OpenFile()),也就是连接到这个槽,执行action_OpenFile()这一成员函数。

5 QMetaObject::connectSlotsByName

这是个可以定义在ui_Class中的函数。自动生成的文件中,该函数总会存在setUi函数的最后一句。作用是自动关联信号与槽:把所有匹配的子对象的信号关联到object对象的符合下列规则的槽函数void on_<窗口部件名称>_<信号名称>(<信号参数>)。对于同名的控件,connectSlotsByName只会连接子对象链表里的第一个对象的信号到槽上。
这样,可以省去很多connect的编写。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值