Qt中QPushButton数组绑定槽并获取唯一点击标识的实现方案咨询
问题原因与解决方案
现有问题排查
1. 函数指针写法编译报错原因
QPushButton的clicked信号默认携带bool类型的选中状态参数,而QSignalMapper::map()是无参槽函数,二者签名不匹配导致编译失败。如果要继续使用函数指针写法,需要指定无参版本的信号:
connect(&checkers[i+j*size], qOverload<>(&QPushButton::clicked), signalMapper, &QSignalMapper::map);
2. SIGNAL/SLOT宏写法点击无响应原因
代码存在下标绑定错误:内层循环中用&checkers[i]做映射,i是内层循环的列号,并非按钮数组的全局下标i+j*size,导致大部分按钮的映射关系完全绑定错误,自然触发不了槽函数。
方案选型建议
优先使用lambda表达式实现,比QSignalMapper更适配当前场景:
- 无需额外维护
QSignalMapper对象,代码更简洁 - 避免映射关系绑定错误的问题,可读性更高
- Qt 5.10之后的版本原生支持,完全满足项目需求
具体实现步骤
- 删掉所有
QSignalMapper相关代码 - 按钮初始化循环中直接用lambda绑定点击事件:
// 在内层循环、按钮属性设置完成后添加如下代码 int squareIndex = i + j * size; connect(&checkers[squareIndex], &QPushButton::clicked, this, [this, squareIndex](){ emit SquareClicked(squareIndex); });
额外优化建议
- 当前
GetClicks函数中每次调用都会重复连接SquareClicked和WaitForClick,会导致单次点击触发多次槽函数,建议把该连接放到构造函数中仅执行一次,或者添加Qt::UniqueConnection参数:connect(this, &GameWindow::SquareClicked, this, &GameWindow::WaitForClick, Qt::UniqueConnection); - 代码中
ui->BoardGrid->addWidget(GridGroup)重复调用了两次,可删除冗余的一次 - 棋盘按钮的样式设置可以合并,不用分if-else写重复的尺寸设置代码
内容的提问来源于stack exchange,提问作者Strahan and Dee Kelly
相关产品推荐
相关产品推荐

