Qt 使用QSignalMapper代码阅读起来很笨拙

Qt 使用QSignalMapper代码阅读起来很笨拙,qt,qt5,qsignalmapper,Qt,Qt5,Qsignalmapper,我阅读了QSignalMapper的文档,最后得到了以下代码: _mapperOn.setMapping(ui->btnRelayOn1, 1); _mapperOn.setMapping(ui->btnRelayOn2, 2); _mapperOn.setMapping(ui->btnRelayOn3, 3); _mapperOn.setMapping(ui->btnRelayOn4, 4); _mapperOn.setMapping(ui->btnRelayOn

我阅读了
QSignalMapper
的文档,最后得到了以下代码:

_mapperOn.setMapping(ui->btnRelayOn1, 1);
_mapperOn.setMapping(ui->btnRelayOn2, 2);
_mapperOn.setMapping(ui->btnRelayOn3, 3);
_mapperOn.setMapping(ui->btnRelayOn4, 4);
_mapperOn.setMapping(ui->btnRelayOn5, 5);
_mapperOn.setMapping(ui->btnRelayOn6, 6);
_mapperOn.setMapping(ui->btnRelayOn7, 7);
_mapperOn.setMapping(ui->btnRelayOn8, 8);
_mapperOn.setMapping(ui->btnRelayOnAll, -1);

connect(ui->btnRelayOn1, &QPushButton::clicked, &_mapperOn, static_cast<void (QSignalMapper::*)()>(&QSignalMapper::map));
connect(ui->btnRelayOn2, &QPushButton::clicked, &_mapperOn, static_cast<void (QSignalMapper::*)()>(&QSignalMapper::map));
connect(ui->btnRelayOn3, &QPushButton::clicked, &_mapperOn, static_cast<void (QSignalMapper::*)()>(&QSignalMapper::map));
connect(ui->btnRelayOn4, &QPushButton::clicked, &_mapperOn, static_cast<void (QSignalMapper::*)()>(&QSignalMapper::map));
connect(ui->btnRelayOn5, &QPushButton::clicked, &_mapperOn, static_cast<void (QSignalMapper::*)()>(&QSignalMapper::map));
connect(ui->btnRelayOn6, &QPushButton::clicked, &_mapperOn, static_cast<void (QSignalMapper::*)()>(&QSignalMapper::map));
connect(ui->btnRelayOn7, &QPushButton::clicked, &_mapperOn, static_cast<void (QSignalMapper::*)()>(&QSignalMapper::map));
connect(ui->btnRelayOn8, &QPushButton::clicked, &_mapperOn, static_cast<void (QSignalMapper::*)()>(&QSignalMapper::map));
connect(ui->btnRelayOnAll, &QPushButton::clicked, &_mapperOn, static_cast<void (QSignalMapper::*)()>(&QSignalMapper::map));
connect(&_mapperOn, &QSignalMapper::mappedInt, this, &FormMonitor::setRelayOn);
\u mapperOn.setMapping(ui->btnRelayOn1,1);
_设置映射(ui->BTNRELEAYN2,2);
_设置映射(ui->btnRelayOn3,3);
_设置映射(ui->btnRelayOn4,4);
_设置映射(ui->btnRelayOn5,5);
_设置映射(ui->btnRelayOn6,6);
_设置映射(ui->btnRelayOn7,7);
_设置映射(ui->btnRelayOn8,8);
_设置映射(ui->btnrelaynall,-1);
连接(ui->btnrelayn1,&QPushButton::clicked,&u mapperOn,static_cast(&QSignalMapper::map));
连接(ui->btnrelayn2,&QPushButton::clicked,&u mapperOn,static_cast(&QSignalMapper::map));
连接(ui->btnRelayOn3,&QPushButton::clicked,&u mapperOn,static_cast(&QSignalMapper::map));
连接(ui->btnRelayOn4,&QPushButton::clicked,&u mapperOn,static_cast(&QSignalMapper::map));
连接(ui->btnRelayOn5,&QPushButton::clicked,&u mapperOn,static_cast(&QSignalMapper::map));
连接(ui->btnRelayOn6,&QPushButton::clicked,&u mapperOn,static_cast(&QSignalMapper::map));
连接(ui->btnRelayOn7,&QPushButton::clicked,&u mapperOn,static_cast(&QSignalMapper::map));
连接(ui->btnRelayOn8,&QPushButton::clicked,&u mapperOn,static_cast(&QSignalMapper::map));
连接(ui->btnrelaynall,&QPushButton::clicked,&u mapperOn,static_cast(&QSignalMapper::map));
连接(&_mapperOn,&QSignalMapper::mappedInt,this,&FormMonitor::setRelayOn);
在我的表单中,我有8个
QPushButton
s,我将它们映射到我的
QSignalMapper
,以便通过索引将它们连接到同一个插槽


它可以工作。但是我一点都不喜欢代码!这和将每个按钮连接到自己的插槽没有多大区别。。。我希望我误解了文档,并且有更好的方法来避免这种笨拙的代码。我的实际表单包含几种此类设置。

当您需要许多作为一个组工作的小部件时,您可以创建复合小部件,在其中封装映射,并提供公共接口(信号),作为更易于管理的内容

或者,您可以像qt示例中那样动态创建按钮

至少,您可以将按钮放入
QList
中,并在循环中连接和映射它们

QSignalMapper\u mapperOn;
QList按钮={
ui->btnRelayOn1,
ui->btnRelayion2,
ui->BTN重新布局3,
ui->BTN重新布局4,
ui->BTN重新布局5,
ui->BTN重新布局6,
ui->BTN重新布局7,
ui->btnRelayOn8
};
for(int i=0;ibtnRelayOnAll,-1);
连接(ui->btnrelaynall,&QPushButton::clicked,&u mapperOn,&QSignalMapper::map);
连接(&_mapperOn,&QSignalMapper::mappedInt,this,&FormMonitor::setRelayOn);

当您需要许多小部件作为一个组工作时,您可以创建复合小部件,在其中封装映射,并提供公共接口(信号),使其更易于管理

或者,您可以像qt示例中那样动态创建按钮

至少,您可以将按钮放入
QList
中,并在循环中连接和映射它们

QSignalMapper\u mapperOn;
QList按钮={
ui->btnRelayOn1,
ui->btnRelayion2,
ui->BTN重新布局3,
ui->BTN重新布局4,
ui->BTN重新布局5,
ui->BTN重新布局6,
ui->BTN重新布局7,
ui->btnRelayOn8
};
for(int i=0;ibtnRelayOnAll,-1);
连接(ui->btnrelaynall,&QPushButton::clicked,&u mapperOn,&QSignalMapper::map);
连接(&_mapperOn,&QSignalMapper::mappedInt,this,&FormMonitor::setRelayOn);