如何在点击时将矩阵中按钮的坐标传递到插槽
How to pass coordinates of button in matrix to slot on click?
我从C++和Qt开始。我有一个QPushButtons矩阵,我想为它们处理点击事件。问题是我不能告诉插槽阵列中按钮的坐标,这样我就可以玩了。我已经成功地将一个整数传递到我的插槽,但不是同时传递两个坐标。我不确定我是否把自己说得足够清楚。。。这是我的问题代码:
for (int i = 0; i < mapSize_x; i++) {
for (int j = 0; j < mapSize_y; j++) {
buttonsArray[i][j] = new QPushButton();
ui->mainLayout->addWidget(buttonsArray[i][j], i, j);
connect(buttonsArray[i][j], SIGNAL(clicked()),
signalMapper, SLOT(map()));
signalMapper->setMapping(buttonsArray[i][j], i, j); // here
}
}
connect(signalMapper, SIGNAL(mapped(int, int)),
this, SLOT(buttonClick(int, int)));
setMapping只接受两个参数,我想传递三个。有变通办法吗?我在谷歌上搜索了很多,仍然找不到答案。我也尝试过传递QPushButton对象而不是坐标,但也没有成功。提前谢谢。
考虑使用QHash
来存储按钮,由按钮本身键控,并指向包含其行和列的一对按钮。然后,您应该能够根据小部件指针设置映射,然后在信号映射器发出信号时查找关联的行和列。例如,如下声明类数据成员:
QHash<QPushButton*, QPair<int, int> > buttonHash;
然后你上面的代码可能会变成
for (int i = 0; i < mapSize_x; i++) {
for (int j = 0; j < mapSize_y; j++) {
QPair<int, int> gridPair(i, j);
QPushButton* button = new QPushButton();
buttonHash.insert(button, gridPair);
ui->mainLayout->addWidget(button, i, j);
connect(button, SIGNAL(clicked()),
signalMapper, SLOT(map()));
signalMapper->setMapping(button, qobject_cast<QWidget*>(button));
}
}
connect(signalMapper, SIGNAL(mapped(QWidget*)),
this, SLOT(buttonClick(QWidget*)));
最后,您的buttonClick
插槽将变成以下内容:
void SomeClass::buttonClick(QWidget* widget) {
QPair<int, int> pair = buttonHash.value(qobject_cast<QPushButton*>(widget));
int myRow = pair.first;
int myColumn = pair.second;
...
}
至少还有两种其他方法可以解决这个问题:
- 您可以尝试将行和列组合成一个字符串,并使用
QSignalMapper::setMapping(QObject*, const QString&)
。这将需要一些逻辑来将行和列从buttonClick
槽中的字符串中拉出 - 您可以尝试使用移位和逐位OR将行和列组合为一个整数。然后您可以依赖
QSignalMapper::setMapping(QObject*, int)
。这将需要一些逻辑来将行和列从buttonClick
插槽中的整数中拉出
我不会详细介绍这些其他解决方案,因为它们有些丑陋。我上面提供的解决方案仍然是最直观的。
QSignalMapper
类在某些情况下可能非常有用,但对于您当前的用例来说,它可能有些过头了。
相反,考虑使用QButtonGroup,它正是为您想要做的事情而设计的,并提供了一个更干净、更简单的API。
相关文章:
- QGraphicsPolygonItem在拖动时未更新QPolygonF坐标
- 问:如何使用C++中的按钮从窗口打开窗口
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 在C++中使用GDAL可以将图像的像素坐标转换为lat,long吗
- QML按钮点击功能执行顺序
- 当用户超过按钮点击限制时报告
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- 函数计算用户按下按钮的频率
- 热键/按钮,根据需要进行编译,但不运行(在F5和Ctrl+Shift+B之间)
- FLTK:按下哪个按钮 - 将数字传递给按钮的回调 (lambda)
- 如何通过按下第三个窗口中的按钮,将QString从一个窗口获取到另一个窗口
- 垂直方向的 Gtk3+ 旋转按钮 (c/c++)
- Qt自定义QPush按钮未显示在布局上
- SDL 操纵杆按钮按下/C++
- 如何使用按钮更新GTK3图像以使用C++从相机捕获图片
- Qt中来自不同功能的按钮引用
- WinAPI 在单击第一个对话框上的按钮控件并销毁第一个对话框后创建第二个对话框
- ImGui 在单击按钮后冻结
- WinAPI 无法创建按钮
- 如何在点击时将矩阵中按钮的坐标传递到插槽