QSignalMapper Class
La classe QSignalMapper regroupe les signaux provenant d'émetteurs identifiables. En savoir plus...
| En-tête : | #include <QSignalMapper> |
| CMake : | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake : | QT += core |
| Hérite de : | 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) |
Slots publics
Signaux
| void | mappedInt(int i) |
| void | mappedObject(QObject *object) |
| void | mappedString(const QString &text) |
Description détaillée
Cette classe regroupe un ensemble de signaux sans paramètre et les réémet avec des paramètres de type entier, chaîne de caractères ou widget correspondant à l’objet qui a envoyé le signal. Notez que dans la plupart des cas, vous pouvez utiliser des lambdas pour transmettre des paramètres personnalisés aux slots. Cette méthode est moins gourmande en ressources et simplifie le code.
La classe prend en charge le mappage de chaînes de caractères, d’entiers, d’objets et de widgets particuliers à des objets spécifiques à l’aide de la fonction ` setMapping()`. Les signaux des objets peuvent alors être connectés au slot ` map()`, qui émettra un signal (il peut s’agir de ` mappedInt()`, ` mappedString()` ou ` mappedObject()`) avec une valeur associée à l’objet émetteur d’origine. Les mappages peuvent être supprimés ultérieurement à l’aide de ` removeMappings()`.
Exemple : supposons que nous souhaitions 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 souhaitons connecter tous les boutons à un seul slot et paramétrer ce slot en fonction du bouton sur lequel l’utilisateur a cliqué.
Voici la définition d’un widget personnalisé simple doté d’un seul signal, ` clicked()`, qui est émis avec le texte du bouton sur lequel on a 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 créé et, pour chaque texte de la liste, un ` QPushButton ` est généré. Nous connectons le signal ` clicked() ` de chaque bouton au slot ` map()` du mappeur de signaux, puis nous créons dans ce dernier un mappage entre chaque bouton et le texte correspondant. 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 slots. L’exemple ci-dessus peut être réécrit de manière plus simple 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 également QObject, QButtonGroup et QActionGroup.
Documentation des fonctions membres
[explicit] QSignalMapper::QSignalMapper(QObject *parent = nullptr)
Crée un objet `QSignalMapper` dont le parent est ` parent`.
[virtual noexcept] QSignalMapper::~QSignalMapper()
Supprime l'QSignalMapper.
[slot] void QSignalMapper::map()
Cet emplacement émet des signaux en fonction de l'objet qui lui envoie des signaux.
Remarque : ce slot est surchargé. Pour vous 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(); });[slot] void QSignalMapper::map(QObject *sender)
Cet emplacement émet des signaux basés sur l'objet « sender ».
Remarque : ce slot est surchargé. Pour vous 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); }); [signal] void QSignalMapper::mappedInt(int i)
Ce signal est émis lorsqu'un objet disposant d'un mappage d'entiers définit la méthode ` map()` est appelé. L'entier mappé de l'objet est transmis via ` i`.
Voir également setMapping().
[signal] void QSignalMapper::mappedObject(QObject *object)
Ce signal est émis lorsqu'un objet disposant d'un mappage d'objets déclenche l'événement « map() ». L'objet fourni par le mappage est transmis à la méthode « object ».
Voir également setMapping().
[signal] void QSignalMapper::mappedString(const QString &text)
Ce signal est émis lorsqu'une méthode ` map()` est appelée depuis un objet pour lequel un mappage de chaînes a été défini. La chaîne mappée de l'objet est transmise via ` text`.
Voir également setMapping().
QObject *QSignalMapper::mapping(int id) const
Renvoie l'QObject de l'expéditeur associé à l'id.
Voir aussi setMapping().
QObject *QSignalMapper::mapping(QObject *object) const
Renvoie l'QObject de l'expéditeur associé à l'object.
Cette fonction surcharge la méthode QSignalMapper::mapping().
QObject *QSignalMapper::mapping(const QString &id) const
Cette fonction surcharge la méthode ` QSignalMapper::mapping()`.
void QSignalMapper::removeMappings(QObject *sender)
Supprime tous les mappages pour sender.
Cette opération est effectuée automatiquement lorsque les objets mappés sont détruits.
Remarque : cela ne déconnecte aucun signal. Si sender n'est pas détruit, cette opération devra être effectuée explicitement si nécessaire.
void QSignalMapper::setMapping(QObject *sender, QObject *object)
Ajoute un mappage de sorte que, lorsque le signal « map() » est émis par l'sender, le signal « mappedObject » (object ) soit émis.
Il ne peut y avoir qu’un seul objet par émetteur.
Voir également mapping().
void QSignalMapper::setMapping(QObject *sender, const QString &text)
Ajoute un mappage de sorte que, lorsque le signal « map() » est émis depuis l'sender, le signal « mappedString » (text ) soit émis.
Il ne peut y avoir qu'un seul texte par expéditeur.
void QSignalMapper::setMapping(QObject *sender, int id)
Ajoute un mappage de sorte que, lorsque le signal map() est émis à partir de l'sender indiquée, le signal mappedInt(id) soit émis.
Il ne peut y avoir qu’un seul identifiant entier par expéditeur.
Voir également 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.