Это дополнительный вопрос Эффективный способ сделать массив меток.
У меня есть массив кнопок, сделанных с помощью кода (не дизайнера), которые все добавляются в gridlayout. Я хочу иметь возможность нажимать любую кнопку на этой сетке и вызывать одну и ту же функцию со строкой и столбцом в качестве параметров. Почему я хочу этого, потому что мне не хочется писать функции 15×15, которые все делают одно и то же.
Есть ли способ или я должен попытаться найти другое решение?
Ps. Все остальные мои входные данные сделаны в конструкторе qt через «go to slot», так что если это произойдет иначе, я не буду знать, как это сделать.
Изменить: Массив меток теперь является массивом кнопок.
Вы можете подключить все свои кнопки к слоту без параметров, а затем получить позицию отправителя в следующих шагах:
QObject
в QWidget через qobject_cast
QWidget
с помощью QLayout::indexOf(QWidget *widget)
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()));
// ...
По умолчанию QLabel не имеет сигнала «нажал».
Но вы можете создать свой собственный QLabel с двумя целыми числами (строка, столбец), а когда у вас есть mouseReleaseEvent (или mousePressEvent), вы отправляете собственный сигнал, который выглядит следующим образом: clicked (int row, int col).
Вы также можете использовать QSignalMapper:
http://qt-project.org/doc/qt-4.8/qsignalmapper.html#details