QSignalMapper类有序处理多个类似信号

简而言之,可以把SignalMapper这个类看成是信号的翻译和转发器, 它可以把一个无参数的信号翻译成带int参数、QString参数、QObject参数或者QWidget参数的信号, 比如, 有一堆的button, 可以把clicked事件放在一个函数里处理, 只要给button编个号或者给button起个名就行了, 这样就不用给每个button写一个slot了,这样是不是就很方便了呢!

下面用代码示例进行简单描述:比如在MainWindow的工具栏中创建多个Action。

1. 在工程类构造中将转发的信号连接到最终的槽函数:

	// 创建消息映射
	QSignalMapper *m_pMapper = new QSignalMapper(this);
	if (m_pMapper)
	{
		connect(m_pMapper, SIGNAL(mapped(int)), this, SLOT(OnActions(int)));
	}

2. 在MainWindow的工具栏中创建多个Action

bool ****::createAction(int nId, const QString &iconFile, const char *name)
{
	if (iconFile.isEmpty() || !name || !name[0] || !m_pMapper)
	{
		return false;
	}

	// 创建 Action 并初始化
	QAction *act = new QAction(QIcon(iconFile), name, this);

	//设置 signalmapper 的转发规则, 转发为参数为 int 类型的信号, 并把 nId 的值作为实参传递。
	m_pMapper->setMapping(act, nId);
	
	//原始信号传递给signalmapper
	connect(act, SIGNAL(triggered()), m_pMapper, SLOT(map()));

	return true;
}

3. 至此,已经完成了源信号(QAction)和信号转发器(QSignalMapper)的绑定,以及QSignalMapper和源信号slot的连接

如果还需要获取已创建的Action以做它用,比如:要获取已经创建的Action添加在MainWindow的ToolBar中,则可以通过QSignalMapper中的成员mapping(…),以setMapping(…)时转发的类型,返回与nId关联的发送者QObject。

// 获取 Action
QAction *act	  = qobject_cast<QAction *>(m_pMapper->mapping(ID_BILL_VERIFY));
QToolBar *toolBar = new QToolBar(this);
// 添加至 toolBar
toolBar->addAction(act);

从以上例子相比可以看出QSignalMapper用法还是比较简单的,主要有以下三点:

  1. 把源信号(不带参)连接到SignalMapper的map槽函数上;
  2. 调用setMapper方法添加映射,以便当map()从给定的发送方发出信号时,发出映射的信号(id),每个发送者最多可以有一个整数ID。通俗的讲就是告诉SignalMapper如何去处理原始信号, 在文例中是把源信号转化为一个带int参数的信号;
  3. 接收转化后的带参数信号, 这里所把转化后的信号与槽函数OnActions(int)连接, 在槽函数中完成其他任务。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QSignalMapper 是一个 Qt ,它可以将一个信号映射到多个接收者中的一个,并将信号的参数转换为一个整数、字符串或者 QObject 指针等型的数据。这个常用于在 GUI 应用程序中把多个 QAction 或 QPushButton 的点击事件映射到一个槽函数中,然后根据信号发射者的不同执行不同的操作。 QSignalMapper 中的两个主要方法是 setMapping() 和 map()。setMapping() 方法用来将一个QObject对象映射到一个整数、字符串或者 QObject 指针等型的数据。map() 方法用来触发信号映射,并将映射的数据作为参数传递给槽函数。 以下是一个使用 QSignalMapper 实现多个 QPushButton 点击事件的示例代码: ```cpp QSignalMapper *signalMapper = new QSignalMapper(this); connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(handleButton(int))); QPushButton *button1 = new QPushButton("Button 1", this); QPushButton *button2 = new QPushButton("Button 2", this); signalMapper->setMapping(button1, 1); signalMapper->setMapping(button2, 2); connect(button1, SIGNAL(clicked()), signalMapper, SLOT(map())); connect(button2, SIGNAL(clicked()), signalMapper, SLOT(map())); void MyClass::handleButton(int buttonId) { if (buttonId == 1) { // do something for button 1 } else if (buttonId == 2) { // do something for button 2 } } ``` 在这个示例中,我们新建了一个 QSignalMapper 对象 signalMapper,并连接了它的 mapped() 信号到 MyClass 的槽函数 handleButton() 中。我们创建了两个 QPushButton 对象 button1 和 button2,并使用 setMapping() 方法将它们分别映射为整数 1 和 2。然后我们使用 connect() 方法将按钮的 clicked() 信号连接到 signalMapper 的 map() 槽函数上。当按钮被点击时,signalMapper 就会触发 mapped() 信号,并将映射的整数作为参数传递给 handleButton() 槽函数。在 handleButton() 槽函数中,我们可以根据不同的按钮标识符执行不同的操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值