Несколько кнопок при нажатии той же функции

Это дополнительный вопрос Эффективный способ сделать массив меток.

У меня есть массив кнопок, сделанных с помощью кода (не дизайнера), которые все добавляются в gridlayout. Я хочу иметь возможность нажимать любую кнопку на этой сетке и вызывать одну и ту же функцию со строкой и столбцом в качестве параметров. Почему я хочу этого, потому что мне не хочется писать функции 15×15, которые все делают одно и то же.

Есть ли способ или я должен попытаться найти другое решение?

Ps. Все остальные мои входные данные сделаны в конструкторе qt через «go to slot», так что если это произойдет иначе, я не буду знать, как это сделать.

Изменить: Массив меток теперь является массивом кнопок.

2

Решение

Вы можете подключить все свои кнопки к слоту без параметров, а затем получить позицию отправителя в следующих шагах:

  1. Брось отправителя QObject в QWidget через qobject_cast
  2. Получить индекс этого QWidget с помощью QLayout::indexOf(QWidget *widget)
  3. Затем получите строку, столбец, диапазон столбцов и диапазон строк с помощью QGridLayout::getItemPosition(int index, int *row, int *column, int *rowSpan, int *columnSpan)

Пример кода будет выглядеть так:

void MyWidgetWithAllLabels::commonSlot()
{
QWidget *buttonWidget = qobject_cast<QWidget*>(sender());
if (!buttonWidget)
return;

int indexOfButton = ui->gridLayout->indexOf(buttonWidget);
int rowOfButton, columnOfButton, rowSpanOfButton, columnSpanOfButton;

ui->gridLayout->getItemPosition(indexOfButton,
&rowOfButton, &columnOfButton, &rowSpanOfButton, &columnSpanOfLabel);
// Now you can get a reference to that specific QPushButton
QLayoutItem *item = ui->gridLayout->itemAtPosition(rowOfButton, columnOfButton);
QPushButton *clickedButton = qobject_cast<QPushButton*>(item->widget());
if (!clickedButton)
return;
// ... do something with that clickedButton
}

Ссылаясь на код в соответствующем сообщении, вы можете подключить свои кнопки к этому слоту следующим образом:

connect( ui->tile_0_0, SIGNAL(clicked()),
this, SLOT(commonSlot()));
connect( ui->tile_0_1, SIGNAL(clicked()),
this, SLOT(commonSlot()));
// ...
2

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

По умолчанию QLabel не имеет сигнала «нажал».
Но вы можете создать свой собственный QLabel с двумя целыми числами (строка, столбец), а когда у вас есть mouseReleaseEvent (или mousePressEvent), вы отправляете собственный сигнал, который выглядит следующим образом: clicked (int row, int col).

Вы также можете использовать QSignalMapper:
http://qt-project.org/doc/qt-4.8/qsignalmapper.html#details

0

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