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

时间:2012-10-05 15:46:25

标签: c++ qt signals-slots

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

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只接受两个参数,我想传递三个。有解决方法吗?我google了很多,仍然找不到答案。我也尝试传递QPushButton对象而不是坐标,但也没有成功。提前谢谢。

2 个答案:

答案 0 :(得分:2)

考虑使用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;

   ...
}

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

  1. 您可以尝试将行和列合并为一个字符串,然后使用QSignalMapper::setMapping(QObject*, const QString&)。这将需要一些逻辑来从buttonClick槽中的字符串中拉出行和列。
  2. 您可以尝试使用位移和按位OR将行和列合并为单个整数。然后,您可以依赖QSignalMapper::setMapping(QObject*, int)。这需要一些逻辑来将行和列拉出buttonClick槽中的整数。
  3. 我不会详细介绍其他解决方案,因为它们有些难看。我上面提供的解决方案仍然是最直观的。

答案 1 :(得分:0)

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

相反,请考虑使用专为您尝试做的设计的QButtonGroup,并提供更清晰,更简单的API。