运用QSignalMapper分类有序的处理大量信号

      简单的理解,可以把SignalMapper这个类看成是信号的翻译和转发器, 它可以把一个无参数的信号翻译成带int参数、QString参数、QObject*参数或者QWidget*参数的信号, 并将之转发。 这么一说大家有没有联想到该类的适用范围呢? 呵呵, 是不是一下就想到了如果我有一堆的button, 可以把clicked事件放在一个函数里处理, 只要给button编个号或者给button起个名就行了, 这样就不用给每个button写一个slot了,岂不是很方便?

      下面这段代码实现该功能

#pragma once

#include <QWidget>
#include <QSignalMapper>
#include <QGridLayout>
#include <QPushButton>
#include <QMessageBox>
class main_widget : public QWidget
{
	Q_OBJECT

public:
	main_widget(QWidget *parent=0);
	~main_widget();
private:
	QSignalMapper *signalMapper;
private slots:
    void doClicked(const QString &btnname);
};
#include "main_widget.h"

main_widget::main_widget(QWidget *parent)
	: QWidget(parent)
{
	QString buttontext = "btn1,btn2,btn3,btn4,btn5,btn6,btn7,btn8,btn9,btn10";
	QStringList texts = buttontext.split(",");
	signalMapper = new QSignalMapper(this);

	QGridLayout *gridLayout = new QGridLayout();
	for (int i = 0; i < texts.size();++i)
	{
		QPushButton *button = new QPushButton(texts[i]);
		//原始信号传递给signalmapper
		connect(button,SIGNAL(clicked()),signalMapper,SLOT(map()));

		//设置signalmapper的转发规则,转发参数为QString类型的信号,
		//并把texts[i]的内容作为实参传递
		signalMapper->setMapping(button,texts[i]);

		gridLayout->addWidget(button, i / 3, i % 3);

	}
	connect(signalMapper,SIGNAL(mapped(const QString &)),this,SLOT(doClicked(const QString &)));
	setLayout(gridLayout);
}

main_widget::~main_widget()
{
}
void main_widget::doClicked(const QString &btnname)
{
	QMessageBox::information(this, "Clicked", btnname + " is clicked!");//显示被按下的btn名称。
} 

   

   从这个例子来看QSignalMapper的用法是非常简单的, 也很容易理解。

*首先把原始不带参数的信号连接到signalmapper的map槽函数, 这样signalmapper能在第一时间接收到原始信号;

*其次调用setMapper方法告诉signalmapper怎样去处理原始信号。 在这个例子中是把原始信号转化为一个带QString参数的信号

*最后接收转化后的带参数信号, 这里所把转化后的信号与槽函数连接, 在槽函数中获得需要的数据。


转自:http://blog.sina.com.cn/s/blog_a3eacdb20101ddcf.html

 

猜你喜欢

转载自blog.csdn.net/m0_37806112/article/details/80167838