このページでは

QSignalMapper Class

QSignalMapper クラスは、特定可能な送信元からのシグナルをまとめて処理します。詳細...

ヘッダー: #include <QSignalMapper>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
継承元: QObject

パブリック関数

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)

パブリックスロット

void map()
void map(QObject *sender)

シグナル

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

詳細説明

このクラスは、パラメータのないシグナルのセットを収集し、シグナルを送信したオブジェクトに対応する整数、文字列、またはウィジェットのパラメータを付けてそれらを再発信します。ほとんどの場合、スロットにカスタムパラメータを渡すためにラムダ式を使用できることに注意してください。これにより、処理負荷が軽減され、コードが簡潔になります。

このクラスは、setMapping() を使用して、特定の文字列、整数、オブジェクト、およびウィジェットを特定のオブジェクトにマッピングすることをサポートしています。その後、オブジェクトのシグナルをmap() スロットに接続すると、元のシグナル送信オブジェクトに関連付けられた値を持つシグナル(mappedInt()、mappedString()、mappedObject() など)が発信されます。 マッピングは、後でremoveMappings()を使用して削除できます。

例:ボタンのグループ(ツールパレットなど)を含むカスタムウィジェットを作成するとします。1つのアプローチとして、各ボタンのclicked() シグナルをそれぞれ独自のカスタムスロットに接続する方法がありますが、この例では、すべてのボタンを単一のスロットに接続し、クリックされたボタンによってそのスロットをパラメータ化したいとします。

以下は、クリックされたボタンのテキストをclicked() シグナルとして送信する、単一のシグナルを持つシンプルなカスタムウィジェットの定義です:

class ButtonWidget : public QWidget
{
    Q_OBJECT

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

signals:
    void clicked(const QString &text);

private:
    QSignalMapper *signalMapper;
};

実装する必要がある関数はコンストラクタだけです:

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

コンストラクタにはテキストのリストが渡されます。シグナルマッパーが構築され、リスト内の各テキストに対してQPushButton が生成されます。各ボタンのclicked() シグナルをシグナルマッパーのmap()スロットに接続し、シグナルマッパー内で各ボタンとそのテキストとのマッピングを作成します。 最後に、シグナルマッパーのmappedString()シグナルを、カスタムウィジェットのclicked() シグナルに接続します。ユーザーがボタンをクリックすると、カスタムウィジェットは、ユーザーがクリックしたボタンのテキストを引数とするclicked() シグナルを1回発火します。

このクラスは、ラムダ関数をスロットとして使用できるようになる以前は、主に有用でした。上記の例は、QSignalMapper を使用せずにラムダ関数に接続することで、より簡潔に書き直すことができます。

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

QObject 、QButtonGroup 、およびQActionGroupも参照してください 。

メンバ関数のドキュメント

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

親としてparent を持つQSignalMapperを生成します。

[virtual noexcept] QSignalMapper::~QSignalMapper()

QSignalMapper を破棄します。

[slot] void QSignalMapper::map()

このスロットは、どのオブジェクトから信号が送信されたかに基づいて信号を出力します。

注:この スロットは オーバーロードされています。このスロットに接続するには:

// 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)

このスロットは、sender オブジェクトに基づいて信号を出力します。

注:この スロットは オーバーロードされています。このスロットに接続するには:

// 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)

このシグナルは、整数のマッピングが設定されているオブジェクトから `map()` が通知されたときに発せられます。オブジェクトのマッピングされた整数は、i に渡されます。

setMapping()も参照してください 。

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

このシグナルは、オブジェクトマッピングが設定されているオブジェクトから `map()` が通知されたときに発せられます。マップによって提供されたオブジェクトは、object に渡されます。

setMapping()も参照してください 。

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

このシグナルは、文字列マッピングが設定されているオブジェクトから `map()` が発火されたときに発生します。オブジェクトのマッピングされた文字列は、text に渡されます。

setMapping()も参照してください 。

QObject *QSignalMapper::mapping(int id) const

id に関連付けられている送信者QObject を返します。

setMapping()も参照してください 。

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

object に関連付けられている送信者QObject を返します。

この関数は、QSignalMapper::mapping() をオーバーロードします。

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

この関数は、QSignalMapper::mapping() をオーバーロードしています。

void QSignalMapper::removeMappings(QObject *sender)

sender のすべてのマッピングを削除します。

これは、マッピングされたオブジェクトが破棄された際に自動的に行われます。

注:これにより シグナルが切断されることはありません。sender が破棄されていない場合、必要に応じてこの操作を明示的に実行する必要があります。

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

sender からmap()がシグナルされた際に、mappedObject (object )シグナルが発信されるよう、マッピングを追加します。

各送信者に対して、オブジェクトは最大1つまで存在します。

mapping()も参照してください 。

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

sender からmap()がシグナルされた際に、mappedString (text )というシグナルが発信されるよう、マッピングを追加します。

送信者ごとに、テキストは最大1つまで指定できます。

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

指定されたsender からmap()がシグナルされた際に、mappedInt (id )というシグナルが発信されるよう、マッピングを追加します。

各送信者に対して、整数 ID は最大 1 つまで指定できます。

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.