QSignalMapper Class

QSignalMapperクラスは識別可能な送信者からのシグナルをバンドルします。詳細...

Header: #include <QSignalMapper>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
Inherits: 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()を使用して、後で削除することができます。

例例:(ツール・パレットのような)ボタン・グループを含むカスタム・ウィジェットを作成したいとします。clicked() しかし、この例では、すべてのボタンを1つのスロットに接続し、クリックされたボタンによってスロットをパラメータ化します。

以下は、シンプルなカスタムウィジェットの定義です。このカスタムウィジェットは、クリックされたボタンのテキストが出力されるシグナルclicked() を1つ持ちます:

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() シグナルを出力します。

このクラスは、ラムダ関数がスロットとして使用できるようになる前は、ほとんど役に立ちました。上の例は、ラムダ関数に接続することで、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);
    }
}

QObjectQButtonGroupQActionGroupも参照して ください。

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

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

親を持つQSignalMapperを構築するparent.

[virtual noexcept] QSignalMapper::~QSignalMapper()

QSignalMapper を破棄します。

[slot] void QSignalMapper::map()

このスロットは、どのオブジェクトがシグナルを送るかに基づいてシグナルを発信します。

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

このスロットは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

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

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

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

この関数は 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()も参照してください

©2024 The Qt Company Ltd. 本書に含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。