Qt修炼手册4_信号与槽

1.前言

为了处理个体间的通信事件,Qt提供了信号与槽。信号与槽不仅可以处理GUI上发生的事件,也可以实现个体间的数据通信。值得深入把握。

2.信号与槽

信号与槽是一种用于对象间通信的机制。为了用户在GUI程序点击按钮控件时可运行指定函数,信号与槽提供可运行指定函数的框架。处理多种用户事件前,信号和槽提供多种回调(Callback)函数

Qt提供的所有控件拥有多种预设信号。例如,QPushButton控件的单击(click)双击(double click)、鼠标经过(mouse over)等多重信号。同时,槽也提供了多种虚函数(virtual function)

信号用于处理发生的事件,而槽则是指定从信号接受事件的处理函数。因此,可以将信号和槽视为一个管道(pipeline).

根据上面的描述,我们也能注意到一个很重要的一点:信号与槽通常不是1:1匹配的。一个信号可以关联多个槽,一个槽也可以关联多个信号。示意图如下:


信号与槽之间的关联函数是connect函数。

3.典型实例

主文件 main.cpp:

#include "mysigslot.h"
#include <QtWidgets/QApplication>

int main(int argc, char *argv[])
{
	QApplication a(argc, argv);
	mySigSlot w;

	w.resize(400, 300);
	w.setWindowTitle("Example for Signal-Slot");

	w.show();
	return a.exec();
}
头文件 mySigSlot.h:

#ifndef MYSIGSLOT_H
#define MYSIGSLOT_H

#include <QtWidgets/QWidget>
#include "ui_mysigslot.h"
#include <qlabel.h>
/*********************************************************/
class mySigSlot : public QWidget
{
	Q_OBJECT

public:
	mySigSlot(QWidget *parent = 0);
	~mySigSlot();

private:
	Ui::mySigSlotClass ui;
private:
	QLabel* lbl;
};
/*********************************************************/
class SignalSlot : public QObject
{
	Q_OBJECT
public:
	SignalSlot()		{ m_value = 0; }
	int value() const	{ return m_value; }

public slots :
	void setvalue(int value);

signals:
	void valueChanged(int newvalue);

private:
	int m_value;
};
/*********************************************************/
#endif // MYSIGSLOT_H
源文件 mySigSlot:
#include "mysigslot.h"

mySigSlot::mySigSlot(QWidget *parent)
	: QWidget(parent)
{
	ui.setupUi(this);

	lbl = new QLabel("",this);
	lbl->setGeometry(10, 10, 100, 40);

	SignalSlot s1, s2;
	QObject::connect(&s1, SIGNAL(valueChanged(int)),
					 &s2, SLOT(setvalue(int)));
	s1.setvalue(100);
	lbl->setText(QString("%1").arg(s2.value()));
}
mySigSlot::~mySigSlot()
{
}

void SignalSlot::setvalue(int value)
{
	m_value = value; //assignment
	//为了发送信号 使用关键字emit
	emit valueChanged(m_value); //emit signal
}
实现结果:

信号与槽的流通过程:

首先定义原则“s1 的 valueChanged()函数被触发,那么s2将被赋予与s1相同的值”。先对s1赋值,该过程激发了信号函数s1.valueChanged(),从而相应“信号-槽”管道,s2.value()获得新值。最后显示在QLabel控件上。

4.参考资料

[1]. 金大 [zhen. Qt 5开发实战[M]. 人民邮电出版社, 2015.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值