介绍
- 在Qt框架中,QSignalMapper类用于简化信号与槽机制的处理。它可以将一个信号连接到多个槽,同时为每个槽提供一个标识符,以便在槽函数中区分不同的信号来源。
- 简单来说一个典型的使用场合是,大量控件都要相应槽函数,而这些槽函数的实现又大致相同。这种情况下,最直接的办法就是仍然为每一个控件的相应信号创建一个槽函数。但这会导致代码的大量重复。此时,我们就可以使用QSignalMapper来实现这种需求。
部分函数
setMapping(QObject *sender, int id)
:将一个发送者(sender)与一个整数标识符(id)进行映射。这个映射将用于在槽函数中区分不同的信号来源。mapping()
:返回与指定发送者(sender)。mappedInt(int i)
:返回与指定发送者(sender)相关联的整数标识符。mappedWidget (QWidget *widget)
:返回与指定发送者(sender)相关联的整数标识符。removeMappings(QObject *sender)
:移除与指定发送者(sender)相关联的所有映射。- …
例子
.h
#pragma once
#include <QWidget>
#include <QPushButton>
#include <QSignalMapper>
#include <QStatusBar>
class myWidget : public QWidget
{
Q_OBJECT
private:
public:
myWidget(QWidget *parent = nullptr);
~myWidget();
void initUI();
private:
QSignalMapper *mapper;
QStatusBar *messager;
};
.cpp
#include "myWidget.h"
#include <QGridLayout>
static const QStringList names = QStringList() << "1"
<< "2"
<< "3"
<< "4"
<< "5"
<< "6"
<< "7"
<< "8"
<< "9"
<< "10"
<< "11"
<< "12"
<< "13"
<< "14"
<< "15"
<< "16";
myWidget::myWidget(QWidget *parent) : QWidget(parent)
{
mapper = new QSignalMapper(this);
messager = new QStatusBar(this);
initUI();
setGeometry(QRect(0, 0, 400, 250));
}
myWidget::~myWidget()
{
}
void myWidget::initUI()
{
QGridLayout *layout = new QGridLayout(this);
int i = 0;
for (auto str : names)
{
QPushButton *buttn = new QPushButton(str, this);
mapper->setMapping(buttn, buttn);
connect(buttn, SIGNAL(clicked()), mapper, SLOT(map()));
layout->addWidget(buttn, i / 4, i % 4);
i++;
}
connect(mapper, &QSignalMapper::mappedWidget, this, [=](QWidget *str)
{ auto buttn = dynamic_cast<QPushButton *>(str);
messager->showMessage(QString("当前选择:%1").arg(buttn->text())); });
setLayout(layout);
}
-效果图