QSignalMapper 类

QSignalMapper 类将可识别发送者的信号捆绑在一起。 更多信息...

头文件 #include <QSignalMapper>
CMakefind_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmakeQT += core
继承 QObject

公共函数

QSignalMapper(QObject *parent = nullptr)
virtual~QSignalMapper()
QObject *mapping(int id) const
QObject *mapping(const QString &id) const
QObject *mapping(QObject *object) const
voidremoveMappings(QObject *sender)
voidsetMapping(QObject *sender, int id)
voidsetMapping(QObject *sender, const QString &text)
voidsetMapping(QObject *sender, QObject *object)

公共槽

voidmap()
voidmap(QObject *sender)

信号

voidmappedInt(int i)
voidmappedObject(QObject *object)
voidmappedString(const QString &text)

详细说明

此类收集一组无参数信号,并以整数、字符串或与发送信号的当前对象对应的窗口参数重新发射它们。请注意,在大多数情况下,您可以使用 lambda 将自定义参数传递给槽。这更节省资源,并将简化代码。

该类通过使用 setMapping() 镜像特定的字符串、整数、对象和窗口,支持与特定对象进行镜像。然后可以将对象的信号连接到 map() 槽,它将发出一个信号(可能是 mappedInt()、mappedString() 和 mappedObject()),其值与原始信号对象相关联。可以使用 removeMappings() 撤销映射。

示例:假设我们想要创建一个包含一组按钮(如工具调色板)的定制小部件。一种方法是连接每个按钮的 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()` 信号。

这个类在 lambda 函数可以用作槽之前很有用。上面的示例可以通过连接到 lambda 函数而更简单地重写,而不使用 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

成员函数文档

[显式] QSignalMapper::QSignalMapper(QObject *parent = nullptr)

使用父对象 `parent` 构造 QSignalMapper。

[虚拟 noexcept] QSignalMapper::~QSignalMapper()

销毁 QSignalMapper

[槽] void QSignalMapper::map()

此槽根据发送信号给它的对象发出信号。

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

此槽根据发信号的对象 `sender` 发出信号。

[信号] void QSignalMapper::mappedInt(int i)

当从设置了整数映射的对象发出 `map()` 信号时,发出此信号。在 i 中传递对象的映射整数。

另请参阅setMapping()。

[信号] void QSignalMapper::mappedObject(QObject *object)

当从设置了对象映射的对象发出 `map()` 信号时,发出此信号。在 object 中传递对象映射。

另请参阅setMapping()。

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

当从设置了字符串映射的对象发出 `map()` 信号时,发出此信号。在 text 中传递对象的映射字符串。

另请参阅setMapping()。

QObject *QSignalMapper::mapping(int id) const

返回与 id 相关联的发送者 QObject

另请参阅setMapping()。

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

此函数重载了 mapping()。

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

此函数重载了 mapping()。

返回与 object 相关联的发送者 QObject

void QSignalMapper::removeMappings(QObject *sender)

移除 sender 的所有映射。

当映射的对象被销毁时,此操作会自动执行。

注意: 这不会断开任何信号。如果 sender 没有被销毁,则可能需要显式地完成此操作(如果需要)。

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

添加一个映射,这样当从给定的 sender 发出 map() 信号时,会发出信号 mappedInt(id)。

对于每个发送者,可能会有最多一个整数 ID。

另请参阅mapping

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

添加一个映射,这样当从 sender 发出 map() 信号时,会发出信号 mappedString(text )。

对于每个发送者,可能会有最多一段文本。

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

添加一个映射,这样当从 sender 发出 map() 信号时,会发出信号 mappedObject(object )。

对于每个发送者,可能会有最多一个对象。

© 2024 The Qt Company Ltd. 本文档中的文档贡献是各自所有者的版权。本提供的文档是根据 Free Software Foundation 发布的 GNU 自由文献许可证版本 1.3 的条款许可的。Qt 及其相关标志是在芬兰和/或世界其他国家的 The Qt Company Ltd. 的商标。所有其他商标均为其各自所有者的财产。