QSignalMapper 类
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(const QString &id) const |
QObject * | mapping(QObject *object) const |
void | removeMappings(QObject *sender) |
void | setMapping(QObject *sender, int id) |
void | setMapping(QObject *sender, const QString &text) |
void | setMapping(QObject *sender, QObject *object) |
公共槽
信号
void | mappedInt(int i) |
void | mappedObject(QObject *object) |
void | mappedString(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); } }
另请参阅QObject,QButtonGroup 和 QActionGroup。
成员函数文档
[显式]
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. 的商标。所有其他商标均为其各自所有者的财产。