我阅读了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);在我的表单中,我有8个QPushButton,我将它们映射到我的QSignalMapper上,以便将它们连接到传递索引的同一个槽上。
,它能工作。,但是我一点也不喜欢代码!这和把每个按钮连接到自己的插槽没什么不同.我希望我误解了文档,并且有更好的方法来避免这种笨拙的代码。我的实际表单包含了几个这样的设置。
发布于 2021-03-26 15:31:05
当您需要许多作为一个组工作的小部件时,您可以创建复合小部件,将映射封装在其中,并提供公共接口(信号)作为更可管理的工具。
或者您可以像在计算器 qt示例中一样动态创建按钮。
至少您可以在QList中放置按钮,并在循环中连接和映射它们。
QSignalMapper _mapperOn;
QList<QPushButton*> buttons = {
ui->btnRelayOn1,
ui->btnRelayOn2,
ui->btnRelayOn3,
ui->btnRelayOn4,
ui->btnRelayOn5,
ui->btnRelayOn6,
ui->btnRelayOn7,
ui->btnRelayOn8
};
for(int i=0;i<buttons.size();i++) {
_mapperOn.setMapping(buttons[i], i);
connect(buttons[i], &QPushButton::clicked, &_mapperOn, &QSignalMapper::map);
}
_mapperOn.setMapping(ui->btnRelayOnAll, -1);
connect(ui->btnRelayOnAll, &QPushButton::clicked, &_mapperOn, &QSignalMapper::map);
connect(&_mapperOn, &QSignalMapper::mappedInt, this, &FormMonitor::setRelayOn);https://stackoverflow.com/questions/66818774
复制相似问题