Несколько кнопок при нажатии той же функции
Это дополнительный вопрос об эффективном способе создания массива меток.
У меня есть массив кнопок, сделанных с помощью кода (не дизайнера), которые все добавляются в gridlayout. Я хочу иметь возможность нажимать любую кнопку на этой сетке и вызывать одну и ту же функцию со строкой и столбцом в качестве параметров. Почему я хочу этого, потому что мне не хочется писать функции 15x15, которые все делают одно и то же.
Есть ли способ или я должен попытаться найти другое решение?
Ps. Все остальные мои входные данные сделаны в конструкторе qt через "go to slot", так что если это произойдет иначе, я не буду знать, как это сделать.
Изменить: массив меток теперь массив кнопок.
2 ответа
Вы можете подключить все свои кнопки к слоту без параметров, а затем получить позицию отправителя в следующих шагах:
- Брось отправителя
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