工作的 QSignalMapper 代码难以阅读

Working QSignalMapper code is clumsy to read

我阅读了 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,以便通过索引将它们全部连接到同一个插槽。

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

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

或者您可以像 calculator 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);