Sur cette page

QSignalMapper Class

La classe QSignalMapper regroupe les signaux provenant d'expéditeurs identifiables. Plus d'informations...

En-tête : #include <QSignalMapper>
CMake : find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake : QT += core
Héritages : QObject

Fonctions publiques

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)

Emplacements publics

void map()
void map(QObject *sender)

Signaux

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

Description détaillée

Cette classe collecte un ensemble de signaux sans paramètre et les réémet avec des paramètres de type entier, chaîne ou widget correspondant à l'objet qui a envoyé le signal. Notez que dans la plupart des cas, vous pouvez utiliser des lambdas pour passer des paramètres personnalisés aux slots. Cela est moins coûteux et simplifie le code.

La classe prend en charge le mappage de chaînes, d'entiers, d'objets et de widgets particuliers avec des objets particuliers à l'aide de setMapping(). Les signaux des objets peuvent alors être connectés au slot map() qui émettra un signal (il pourrait s'agir de mappedInt(), mappedString() et mappedObject()) avec une valeur associée à l'objet de signalisation d'origine. Les correspondances peuvent être supprimées ultérieurement à l'aide de removeMappings().

Exemple : Supposons que nous voulions créer un widget personnalisé contenant un groupe de boutons (comme une palette d'outils). Une approche consiste à connecter le signal clicked() de chaque bouton à son propre slot personnalisé ; mais dans cet exemple, nous voulons connecter tous les boutons à un seul slot et paramétrer ce dernier en fonction du bouton sur lequel on a cliqué.

Voici la définition d'un widget personnalisé simple qui a un seul signal, clicked(), qui est émis avec le texte du bouton qui a été cliqué :

class ButtonWidget : public QWidget
{
    Q_OBJECT

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

signals:
    void clicked(const QString &text);

private:
    QSignalMapper *signalMapper;
};

La seule fonction que nous devons implémenter est le constructeur :

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);
}

Une liste de textes est transmise au constructeur. Un mappeur de signaux est construit et pour chaque texte de la liste, un QPushButton est créé. Nous connectons le signal clicked() de chaque bouton au slot map() du mappeur de signaux, et nous créons une correspondance dans le mappeur de signaux entre chaque bouton et le texte du bouton. Enfin, nous connectons le signal mappedString() du mappeur de signaux au signal clicked() du widget personnalisé. Lorsque l'utilisateur clique sur un bouton, le widget personnalisé émet un seul signal clicked() dont l'argument est le texte du bouton sur lequel l'utilisateur a cliqué.

Cette classe était surtout utile avant que les fonctions lambda puissent être utilisées comme des slots. L'exemple ci-dessus peut être réécrit plus simplement sans QSignalMapper en se connectant à une fonction 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);
    }
}

Voir aussi QObject, QButtonGroup, et QActionGroup.

Documentation des fonctions membres

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

Construit un QSignalMapper avec le parent parent.

[virtual noexcept] QSignalMapper::~QSignalMapper()

Détruit le site QSignalMapper.

[slot] void QSignalMapper::map()

Ce slot émet des signaux en fonction de l'objet qui lui envoie des signaux.

Note : Ce slot est surchargé. Pour se connecter à ce slot :

// 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(); });
Pour plus d'exemples et d'approches, voir se connecter à des slots surchargés.

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

Ce slot émet des signaux basés sur l'objet sender.

Note : Ce slot est surchargé. Pour se connecter à ce slot :

// 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); });
Pour plus d'exemples et d'approches, voir se connecter aux slots surchargés.

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

Ce signal est émis lorsque map() est signalé par un objet dont le mappage des entiers est défini. L'entier mappé de l'objet est transmis à i.

Voir aussi setMapping().

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

Ce signal est émis lorsque map() est signalé à partir d'un objet pour lequel un mappage d'objet a été défini. L'objet fourni par le mappage est transmis à object.

Voir aussi setMapping().

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

Ce signal est émis lorsque map() est signalé à partir d'un objet pour lequel une chaîne de caractères a été définie. La chaîne mappée de l'objet est transmise à text.

Voir aussi setMapping().

QObject *QSignalMapper::mapping(int id) const

Renvoie l'expéditeur QObject associé à id.

Voir aussi setMapping().

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

Renvoie l'expéditeur QObject associé à object.

Cette fonction surcharge QSignalMapper::mapping().

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

Cette fonction surcharge QSignalMapper::mapping().

void QSignalMapper::removeMappings(QObject *sender)

Supprime toutes les correspondances pour sender.

Cette opération est effectuée automatiquement lorsque les objets mappés sont détruits.

Remarque : cette opération ne déconnecte aucun signal. Si sender n'est pas détruit, il faudra le faire explicitement si nécessaire.

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

Ajoute une correspondance de sorte que lorsque map() est signalé par sender, le signal mappedObject(object ) est émis.

Il peut y avoir au maximum un objet pour chaque expéditeur.

Voir aussi mapping().

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

Ajoute une correspondance de sorte que lorsque map() est signalé par sender, le signal mappedString(text ) est émis.

Il peut y avoir au maximum un texte pour chaque expéditeur.

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

Ajoute une correspondance de sorte que lorsque map() est signalé par l'expéditeur sender, le signal mappedInt(id) est émis.

Il peut y avoir au plus un identifiant entier pour chaque expéditeur.

Voir aussi 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.