首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >工作的QSignalMapper代码读起来很笨拙

工作的QSignalMapper代码读起来很笨拙
EN

Stack Overflow用户
提问于 2021-03-26 14:24:24
回答 1查看 33关注 0票数 0

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

代码语言:javascript
复制
_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上,以便将它们连接到传递索引的同一个槽上。

,它能工作。,但是我一点也不喜欢代码!这和把每个按钮连接到自己的插槽没什么不同.我希望我误解了文档,并且有更好的方法来避免这种笨拙的代码。我的实际表单包含了几个这样的设置。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-26 15:31:05

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

或者您可以像在计算器 qt示例中一样动态创建按钮。

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

代码语言:javascript
复制
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);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66818774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档