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

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

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

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

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()));
    // ...

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

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

Другие вопросы по тегам