0

我阅读了文档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);

在我的表单中,我有 8QPushButton个,我将它们映射到我QSignalMapper的,以便将它们全部连接到传递索引的同一个插槽。

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

4

1 回答 1

2

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

或者您可以像在计算器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);
于 2021-03-26T15:31:05.563 回答