如何在点击时将矩阵中按钮的坐标传递到插槽

How to pass coordinates of button in matrix to slot on click?

本文关键字:坐标 按钮 插槽      更新时间:2023-10-16

我从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;
...
}

至少还有两种其他方法可以解决这个问题:

  1. 您可以尝试将行和列组合成一个字符串,并使用QSignalMapper::setMapping(QObject*, const QString&)。这将需要一些逻辑来将行和列从buttonClick槽中的字符串中拉出
  2. 您可以尝试使用移位和逐位OR将行和列组合为一个整数。然后您可以依赖QSignalMapper::setMapping(QObject*, int)。这将需要一些逻辑来将行和列从buttonClick插槽中的整数中拉出

我不会详细介绍这些其他解决方案,因为它们有些丑陋。我上面提供的解决方案仍然是最直观的。

QSignalMapper类在某些情况下可能非常有用,但对于您当前的用例来说,它可能有些过头了。

相反,考虑使用QButtonGroup,它正是为您想要做的事情而设计的,并提供了一个更干净、更简单的API。