Как передать координаты кнопки в матрице в слот при клике?

Я начинаю с 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 принимает только два параметра, и я хочу передать три. Есть ли обходной путь? Я много гуглил и до сих пор не могу найти ответ. Я также попытался передать объект QPushButton вместо координат, но также безуспешно. Заранее спасибо.

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. Вы можете попытаться объединить строку и столбец в одно целое число, используя сдвиг битов и побитовое ИЛИ. Вы могли бы тогда положиться на QSignalMapper::setMapping(QObject*, int), Это потребовало бы некоторой логики, чтобы вытащить строку и столбец из целого числа в buttonClick слот.

Я не буду вдаваться в подробности об этих других решениях, потому что они несколько уродливы. Решение, которое я предоставил выше, остается наиболее интуитивным.

2

Другие решения

QSignalMapper Класс может быть очень полезным в определенных обстоятельствах, но он может быть излишним для вашего текущего варианта использования.

Вместо этого рассмотрите возможность использования QButtonGroup, которая была разработана именно для того, что вы пытаетесь сделать, и предоставляет намного более чистый и простой API.

0

По вопросам рекламы [email protected]