qt signal-slot на QCheckBox(ах), ранее добавленный рекурсивно

Я рекурсивно добавляю несколько флажков в ячейки tableWidget (всегда в столбце 1) для определенной функции. Окончательное количество этих флажков не определено и зависит от ввода пользователя.

QStringList matID;
for(int i=0; i<matID.size(); i++
{
   ui->tableWidget->insertRow( ui->tableWidget->rowCount() );

   QCheckBox *checkBox = new QCheckBox();
   ui->tableWidget->setItem(ui->tableWidget->rowCount()-1,0,checkBox)
}

Я хотел бы соединить каждый из них с соединением сигнального слота, которое сообщает мне, какой из них был проверен.

Может кто-нибудь мне помочь? Я не очень понимаю, как это сделать...

спасибо Джузеппе


person piepolitb    schedule 18.10.2017    source источник
comment
Просто добавьте в свой цикл for: connect(checkBox, &QCheckBox::stateChanged, [=](int state){ qDebug() << "Checkbox clicked" << state; });   -  person user3606329    schedule 18.10.2017
comment
спасибо, но, как вы сказали, я не могу сказать, какой из них был проверен: я всегда получаю 2 или 0 в зависимости от того, какой флажок установлен   -  person piepolitb    schedule 19.10.2017
comment
Я лучше объясню: я хотел бы выдать сигнал, который дает мне значение i (номер строки, где установлен флажок)   -  person piepolitb    schedule 19.10.2017
comment
Вы вызываете getCurrentRow, но это может привести к ошибке, потому что вы вставляете QCheckBox. Поэтому вам нужно сделать обходной путь stackoverflow.com/questions/46641743/   -  person user3606329    schedule 19.10.2017


Ответы (1)


У этой проблемы есть четыре решения. Я опишу только самую чистую возможность.

Лучшее решение — сделать ваш товар доступным для проверки. Вы можете сделать это, установив флаг Qt::ItemIsUserCheckable для элемента с помощью setFlags(), не забудьте также сохранить значения по умолчанию.

QStringList matID;
for(int i=0; i<matID.size(); i++
{
   ui->tableWidget->insertRow( ui->tableWidget->rowCount() );

   QTableWidgetItem *item = ui->tableWidget->getItem(ui->tableWidget->rowCount()-1,0);
   item->setFlags(item->getFlags() | Qt::ItemIsUserCheckable);
}

Затем, как объяснено в Qt/C++: Сигнал, когда объект QListWidgetItem проверяется? (ItemWidgets достаточно похожи), вы можете прослушать itemChanged и проверить с помощью checkState().

Другими методами будут:

  • установить делегата для вашей колонки

  • создайте QSignalMapper для сопоставления ваших собственных указателей QCheckBox с некоторым значением, идентифицирующим ваши строки

  • Используйте функцию-член QObject::sender(), чтобы выяснить, какой флажок был ответственным, и разрешите его обратно в строку самостоятельно.

person Daniël Sonck    schedule 19.10.2017