QSignalMapper Class

Die Klasse QSignalMapper bündelt Signale von identifizierbaren Absendern. Mehr...

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

Öffentliche Funktionen

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)

Öffentliche Slots

void map()
void map(QObject *sender)

Signale

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

Detaillierte Beschreibung

Diese Klasse sammelt eine Reihe von parameterlosen Signalen und sendet sie mit Integer-, String- oder Widget-Parametern zurück, die dem Objekt entsprechen, das das Signal gesendet hat. Beachten Sie, dass Sie in den meisten Fällen Lambdas verwenden können, um benutzerdefinierte Parameter an Slots zu übergeben. Dies ist weniger kostspielig und vereinfacht den Code.

Die Klasse unterstützt die Zuordnung von bestimmten Strings, Integers, Objekten und Widgets zu bestimmten Objekten mit setMapping(). Die Signale der Objekte können dann mit dem Slot map() verbunden werden, der ein Signal (z. B. mappedInt(), mappedString() und mappedObject()) mit einem dem ursprünglichen Signalobjekt zugeordneten Wert ausgibt. Die Zuordnungen können später mit removeMappings() wieder aufgehoben werden.

Beispiel: Angenommen, wir möchten ein benutzerdefiniertes Widget erstellen, das eine Gruppe von Schaltflächen enthält (wie eine Werkzeugpalette). Eine Möglichkeit wäre, das Signal jeder Schaltfläche clicked() mit einem eigenen benutzerdefinierten Slot zu verbinden; in diesem Beispiel wollen wir jedoch alle Schaltflächen mit einem einzigen Slot verbinden und den Slot durch die angeklickte Schaltfläche parametrieren.

Hier ist die Definition eines einfachen benutzerdefinierten Widgets, das ein einziges Signal, clicked(), hat, das mit dem Text der Schaltfläche, die angeklickt wurde, ausgegeben wird:

class ButtonWidget : public QWidget
{
    Q_OBJECT

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

signals:
    void clicked(const QString &text);

private:
    QSignalMapper *signalMapper;
};

Die einzige Funktion, die wir implementieren müssen, ist der Konstruktor:

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

Eine Liste von Texten wird an den Konstruktor übergeben. Ein Signal-Mapper wird erstellt und für jeden Text in der Liste wird ein QPushButton erstellt. Wir verbinden das Signal clicked() jeder Schaltfläche mit dem map()-Slot des Signal-Mappers und erstellen im Signal-Mapper ein Mapping von jeder Schaltfläche zum Text der Schaltfläche. Schließlich verbinden wir das Signal mappedString() des Signal-Mappers mit dem Signal clicked() des benutzerdefinierten Widgets. Wenn der Benutzer auf eine Schaltfläche klickt, gibt das benutzerdefinierte Widget ein einzelnes clicked() Signal aus, dessen Argument der Text der Schaltfläche ist, auf die der Benutzer geklickt hat.

Diese Klasse war vor allem nützlich, bevor Lambda-Funktionen als Slots verwendet werden konnten. Das obige Beispiel kann einfacher ohne QSignalMapper umgeschrieben werden, indem man sich mit einer Lambda-Funktion verbindet.

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

Siehe auch QObject, QButtonGroup, und QActionGroup.

Dokumentation der Mitgliedsfunktionen

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

Konstruiert einen QSignalMapper mit übergeordnetem parent.

[virtual noexcept] QSignalMapper::~QSignalMapper()

Zerstört die QSignalMapper.

[slot] void QSignalMapper::map()

Dieser Steckplatz gibt Signale aus, je nachdem, welches Objekt ihm Signale sendet.

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

Dieser Slot sendet Signale, die auf dem Objekt sender basieren.

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

Dieses Signal wird ausgegeben, wenn map() von einem Objekt signalisiert wird, für das eine Ganzzahlzuordnung festgelegt wurde. Die zugeordnete ganze Zahl des Objekts wird in i übergeben.

Siehe auch setMapping().

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

Dieses Signal wird ausgegeben, wenn map() von einem Objekt signalisiert wird, für das eine Objektzuordnung festgelegt wurde. Das Objekt, das durch die Abbildung bereitgestellt wird, wird in object übergeben.

Siehe auch setMapping().

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

Dieses Signal wird ausgegeben, wenn map() von einem Objekt signalisiert wird, für das ein String-Mapping festgelegt wurde. Die gemappte Zeichenkette des Objekts wird in text übergeben.

Siehe auch setMapping().

QObject *QSignalMapper::mapping(int id) const

Gibt den Absender QObject zurück, der mit dem id verbunden ist.

Siehe auch setMapping().

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

Diese Funktion überlädt mapping().

Gibt den Absender QObject zurück, der mit dem object verbunden ist.

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

Diese Funktion überlastet mapping().

void QSignalMapper::removeMappings(QObject *sender)

Entfernt alle Mappings für sender.

Dies geschieht automatisch, wenn gemappte Objekte zerstört werden.

Hinweis: Dadurch werden keine Signale unterbrochen. Wenn sender nicht zerstört wird, muss dies bei Bedarf explizit durchgeführt werden.

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

Fügt ein Mapping hinzu, so dass bei der Signalisierung von map() vom sender das Signal mappedObject(object ) ausgesendet wird.

Für jeden Absender darf es höchstens ein Objekt geben.

Siehe auch mapping().

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

Fügt ein Mapping hinzu, so dass beim Signal map() von sender das Signal mappedString(text ) ausgegeben wird.

Für jeden Absender darf es höchstens einen Text geben.

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

Fügt eine Zuordnung hinzu, so dass, wenn map() vom angegebenen sender signalisiert wird, das Signal mappedInt(id) ausgegeben wird.

Es darf höchstens eine Integer-ID für jeden Absender geben.

Siehe auch mapping().

© 2025 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.