我是从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对象而不是坐标,但也没有成功。提前谢谢。
答案 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种其他方法可以解决这个问题:
QSignalMapper::setMapping(QObject*, const QString&)
。这将需要一些逻辑来从buttonClick
槽中的字符串中拉出行和列。QSignalMapper::setMapping(QObject*, int)
。这需要一些逻辑来将行和列拉出buttonClick
槽中的整数。我不会详细介绍其他解决方案,因为它们有些难看。我上面提供的解决方案仍然是最直观的。
答案 1 :(得分:0)
QSignalMapper
类在某些情况下非常有用,但对于您当前的用例可能有点过分。
相反,请考虑使用专为您尝试做的设计的QButtonGroup,并提供更清晰,更简单的API。