2

我从 C++ 和 Qt 开始。我有一个 QPushButtons 矩阵,我想为它们处理点击事件。问题是我无法告诉插槽坐标 os 数组中的按钮,以便我可以使用它们。我已经成功地将一个整数传递给我的插槽,但不是两个坐标。我不确定我是否让自己足够清楚......这是我有问题的代码:

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 对象而不是坐标,但也没有成功。提前致谢。

4

2 回答 2

2

考虑使用 aQHash来存储您的按钮,由按钮本身键入并指向包含它们的行和列的一对。然后,您应该能够根据小部件指针设置映射,然后在信号映射器发出信号时查找关联的行和列。例如,如下声明一个类数据成员:

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;

   ...
}

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

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

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

于 2012-10-05T17:12:48.643 回答
0

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

相反,请考虑使用QButtonGroup,它专为您正在尝试做的事情而设计,并提供更清洁和更简单的 API。

于 2012-10-05T17:27:23.417 回答