En esta página

QSignalMapper Class

La clase QSignalMapper agrupa señales de emisores identificables. Más...

Cabecera: #include <QSignalMapper>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
Hereda: QObject

Funciones Públicas

QSignalMapper(QObject *parent = nullptr)
virtual ~QSignalMapper()
QObject *mapping(int id) const
QObject *mapping(QObject *object) const
QObject *mapping(const QString &id) const
void removeMappings(QObject *sender)
void setMapping(QObject *sender, QObject *object)
void setMapping(QObject *sender, const QString &text)
void setMapping(QObject *sender, int id)

Ranuras Públicas

void map()
void map(QObject *sender)

Señales

void mappedInt(int i)
void mappedObject(QObject *object)
void mappedString(const QString &text)

Descripción detallada

Esta clase recoge un conjunto de señales sin parámetros, y las reemite con parámetros enteros, de cadena o widget correspondientes al objeto que envió la señal. Tenga en cuenta que en la mayoría de los casos puede utilizar lambdas para pasar parámetros personalizados a las ranuras. Esto es menos costoso y simplificará el código.

La clase soporta el mapeo de cadenas particulares, enteros, objetos y widgets con objetos particulares usando setMapping(). Las señales de los objetos pueden entonces conectarse a la ranura map() que emitirá una señal (podría ser mappedInt(), mappedString() y mappedObject()) con un valor asociado al objeto de señalización original. Las asignaciones pueden eliminarse posteriormente utilizando removeMappings().

Ejemplo: Supongamos que queremos crear un widget personalizado que contenga un grupo de botones (como una paleta de herramientas). Una posibilidad es conectar la señal clicked() de cada botón a su propia ranura personalizada; pero en este ejemplo queremos conectar todos los botones a una única ranura y parametrizar la ranura por el botón sobre el que se ha pulsado.

Aquí está la definición de un widget personalizado simple que tiene una sola señal, clicked(), que se emite con el texto del botón que fue pulsado:

class ButtonWidget : public QWidget
{
    Q_OBJECT

public:
    ButtonWidget(const QStringList &texts, QWidget *parent = nullptr);

signals:
    void clicked(const QString &text);

private:
    QSignalMapper *signalMapper;
};

La única función que necesitamos implementar es el constructor:

ButtonWidget::ButtonWidget(const QStringList &texts, QWidget *parent)
    : QWidget(parent)
{
    signalMapper = new QSignalMapper(this);

    QGridLayout *gridLayout = new QGridLayout(this);
    for (int i = 0; i < texts.size(); ++i) {
        QPushButton *button = new QPushButton(texts[i]);
        connect(button, &QPushButton::clicked, signalMapper, qOverload<>(&QSignalMapper::map));
        signalMapper->setMapping(button, texts[i]);
        gridLayout->addWidget(button, i / 3, i % 3);
    }

    connect(signalMapper, &QSignalMapper::mappedString,
            this, &ButtonWidget::clicked);
}

Se pasa una lista de textos al constructor. Se construye un mapeador de señales y para cada texto de la lista se crea un QPushButton. Conectamos la señal clicked() de cada botón a la ranura map() del mapeador de señales, y creamos una asignación en el mapeador de señales desde cada botón al texto del botón. Por último, conectamos la señal mappedString() del mapeador de señales a la señal clicked() del widget personalizado. Cuando el usuario pulse un botón, el widget personalizado emitirá una única señal clicked() cuyo argumento es el texto del botón que el usuario ha pulsado.

Esta clase era muy útil antes de que las funciones lambda pudieran usarse como slots. El ejemplo anterior puede reescribirse de forma más simple sin QSignalMapper conectándose a una función lambda.

ButtonWidget::ButtonWidget(const QStringList &texts, QWidget *parent)
    : QWidget(parent)
{
    QGridLayout *gridLayout = new QGridLayout(this);
    for (int i = 0; i < texts.size(); ++i) {
        QString text = texts[i];
        QPushButton *button = new QPushButton(text);
        connect(button, &QPushButton::clicked, [this, text] { clicked(text); });
        gridLayout->addWidget(button, i / 3, i % 3);
    }
}

Véase también QObject, QButtonGroup, y QActionGroup.

Documentación de funciones miembro

[explicit] QSignalMapper::QSignalMapper(QObject *parent = nullptr)

Construye un QSignalMapper con el padre parent.

[virtual noexcept] QSignalMapper::~QSignalMapper()

Destruye el QSignalMapper.

[slot] void QSignalMapper::map()

Esta ranura emite señales en función del objeto que le envía señales.

Nota: Esta ranura está sobrecargada. Para conectarse a esta ranura:

// Connect using qOverload:
connect(sender, &SenderClass::signal,
        signalMapper, qOverload<>(&QSignalMapper::map));

// Or using a lambda as wrapper:
connect(sender, &SenderClass::signal,
        signalMapper, [receiver = signalMapper]() { receiver->map(); });
Para ver más ejemplos y enfoques, consulte conectar con ranuras sobrecargadas.

[slot] void QSignalMapper::map(QObject *sender)

Esta ranura emite señales basadas en el objeto sender.

Nota: Esta ranura está sobrecargada. Para conectarse a esta ranura:

// Connect using qOverload:
connect(sender, &SenderClass::signal,
        signalMapper, qOverload(&QSignalMapper::map));

// Or using a lambda as wrapper:
connect(sender, &SenderClass::signal,
        signalMapper, [receiver = signalMapper](QObject *sender) { receiver->map(sender); });
Para más ejemplos y enfoques, consulte la conexión a ranuras sobrecargadas.

[signal] void QSignalMapper::mappedInt(int i)

Esta señal se emite cuando map() es señalada desde un objeto que tiene un entero mapeado. El entero mapeado del objeto se pasa en i.

Véase también setMapping().

[signal] void QSignalMapper::mappedObject(QObject *object)

Esta señal se emite cuando map() es señalada desde un objeto que tiene un mapeo de objetos establecido. El objeto proporcionado por el mapa se pasa en object.

Véase también setMapping().

[signal] void QSignalMapper::mappedString(const QString &text)

Esta señal se emite cuando map() recibe una señal de un objeto que tiene una cadena asignada. La cadena mapeada del objeto se pasa en text.

Véase también setMapping().

QObject *QSignalMapper::mapping(int id) const

Devuelve el remitente QObject que está asociado a id.

Véase también setMapping().

QObject *QSignalMapper::mapping(QObject *object) const

Devuelve el remitente QObject que está asociado a object.

Esta función sobrecarga QSignalMapper::mapping().

QObject *QSignalMapper::mapping(const QString &id) const

Esta función sobrecarga QSignalMapper::mapping().

void QSignalMapper::removeMappings(QObject *sender)

Elimina todas las asignaciones de sender.

Esto se hace automáticamente cuando se destruyen los objetos mapeados.

Nota: Esto no desconecta ninguna señal. Si sender no se destruye, esto tendrá que hacerse explícitamente si es necesario.

void QSignalMapper::setMapping(QObject *sender, QObject *object)

Añade un mapeo para que cuando se emita la señal map() desde sender, se emita la señal mappedObject(object ).

Puede haber como máximo un objeto por cada emisor.

Véase también mapping().

void QSignalMapper::setMapping(QObject *sender, const QString &text)

Añade un mapeo para que cuando se emita la señal map() desde sender, se emita la señal mappedString(text ).

Puede haber como máximo un texto para cada emisor.

void QSignalMapper::setMapping(QObject *sender, int id)

Añade un mapeo para que cuando se emita la señal map() desde el sender dado, se emita la señal mappedInt(id).

Puede haber como máximo un ID entero para cada emisor.

Véase también mapping().

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.