QSignalMapper 会收集一组无参数信号,并使用与发送信号的对象对应的整数、字符串或小部件参数重新发送这些信号。在大多数情况下,可以使用lambdas将自定义参数传递给插槽。

该类支持使用setMapping()将特定字符串或整数映射到特定对象。然后可以将对象的信号连接到map()插槽,该插槽将发出带有与原始信号对象关联的字符串或整数的mapped()信号。以后可以使用removeMappings()删除映射。

适应场景

示例:比如说要做一个调色板,或者触摸屏的拨号面板,只要是这些“组件”的参数是一致的,就可以把他们的信号收集起来,集中处理。不用单独每个“组件”都写一个对应的槽函数。

示例代码

头文件:

#pragma once

#include <QtWidgets/QDialog>
#include <QSignalMapper>


class QSignalMapperTest : public QDialog
{
    Q_OBJECT

public:
    QSignalMapperTest(QWidget *parent = Q_NULLPTR);

private slots:
	void slotButtClicked(const QString & btnname);

private:
	QSignalMapper *signalMapper;
};

实现文件:

#include "QSignalMapperTest.h"
#include <QGridLayout>
#include <QPushButton>
#include <QMessageBox>
#include <QDebug>


QSignalMapperTest::QSignalMapperTest(QWidget *parent)
    : QDialog(parent)
{
	setFixedSize(QSize(300, 240));
	setWindowFlags(Qt::CustomizeWindowHint | Qt::WindowCloseButtonHint);

	signalMapper = new QSignalMapper(this);
	QStringList texts = { "1", "2" , "3", "4", "5" , "6", "7", "8" , "9" };

	QGridLayout *gridLayout = new QGridLayout;
	gridLayout->setContentsMargins(20, 20, 20, 20);
	for (int i = 0; i < texts.size(); ++i)
	{
		QPushButton *button = new QPushButton(texts[i]);
		button->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
		gridLayout->addWidget(button, i / 3, i % 3);

		connect(button, SIGNAL(clicked()), signalMapper, SLOT(map()));
		signalMapper->setMapping(button, texts[i]);
	}
	setLayout(gridLayout);

	/*connect(signalMapper, SIGNAL(mapped(QString)), this, SIGNAL(clicked(QString)));*/
	connect(signalMapper, SIGNAL(mapped(const QString &)), this, SLOT(slotButtClicked(const QString &)));	
}

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

最终效果

在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐