QT QSignalMapper 了解一下
此类收集一组无参数信号,并使用与发送信号的对象对应的整数、字符串或小部件参数重新发送这些信号。请注意,在大多数情况下,可以使用lambdas将自定义参数传递给插槽。这会降低成本并简化代码。该类支持使用setMapping()将特定字符串或整数映射到特定对象。然后可以将对象的信号连接到map()插槽,该插槽将发出带有与原始信号对象关联的字符串或整数的mapped()信号。以后可以使用removeMa
·
QSignalMapper 会收集一组无参数信号,并使用与发送信号的对象对应的整数、字符串或小部件参数重新发送这些信号。在大多数情况下,可以使用lambdas将自定义参数传递给插槽。
该类支持使用setMapping()将特定字符串或整数映射到特定对象。然后可以将对象的信号连接到map()插槽,该插槽将发出带有与原始信号对象关联的字符串或整数的mapped()信号。以后可以使用removeMappings()删除映射。
适应场景
示例:比如说要做一个调色板,或者触摸屏的拨号面板,只要是这些“组件”的参数是一致的,就可以把他们的信号收集起来,集中处理。不用单独每个“组件”都写一个对应的槽函数。
示例代码
头文件:
#pragma once
#include <QtWidgets/QDialog>
#include <QSignalMapper>
class QSignalMapperTest : public QDialog
{
Q_OBJECT
public:
QSignalMapperTest(QWidget *parent = Q_NULLPTR);
private slots:
void slotButtClicked(const QString & btnname);
private:
QSignalMapper *signalMapper;
};
实现文件:
#include "QSignalMapperTest.h"
#include <QGridLayout>
#include <QPushButton>
#include <QMessageBox>
#include <QDebug>
QSignalMapperTest::QSignalMapperTest(QWidget *parent)
: QDialog(parent)
{
setFixedSize(QSize(300, 240));
setWindowFlags(Qt::CustomizeWindowHint | Qt::WindowCloseButtonHint);
signalMapper = new QSignalMapper(this);
QStringList texts = { "1", "2" , "3", "4", "5" , "6", "7", "8" , "9" };
QGridLayout *gridLayout = new QGridLayout;
gridLayout->setContentsMargins(20, 20, 20, 20);
for (int i = 0; i < texts.size(); ++i)
{
QPushButton *button = new QPushButton(texts[i]);
button->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
gridLayout->addWidget(button, i / 3, i % 3);
connect(button, SIGNAL(clicked()), signalMapper, SLOT(map()));
signalMapper->setMapping(button, texts[i]);
}
setLayout(gridLayout);
/*connect(signalMapper, SIGNAL(mapped(QString)), this, SIGNAL(clicked(QString)));*/
connect(signalMapper, SIGNAL(mapped(const QString &)), this, SLOT(slotButtClicked(const QString &)));
}
void QSignalMapperTest::slotButtClicked(const QString& btnname)
{
//显示被按下的btn名称
QMessageBox::information(this, "Clicked", btnname + " is clicked!");
}
最终效果
更多推荐
已为社区贡献2条内容
所有评论(0)