先前递归添加的QCheckBox(es)上的qt信号插槽

先前递归添加的QCheckBox(es)上的qt信号插槽,qt,checkbox,signals-slots,qcheckbox,Qt,Checkbox,Signals Slots,Qcheckbox,我在特定函数的tableWidget单元格(始终在第1列)中递归添加一些复选框。这些复选框的最终数量未定义,取决于用户输入 QStringList matID; for(int i=0; i<matID.size(); i++ { ui->tableWidget->insertRow( ui->tableWidget->rowCount() ); QCheckBox *checkBox = new QCheckBox(); ui->tabl

我在特定函数的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)
}
QStringList-matID;
对于(inti=0;itableWidget->insertRow(ui->tableWidget->rowCount());
QCheckBox*复选框=新的QCheckBox();
ui->tableWidget->setItem(ui->tableWidget->rowCount()-1,0,复选框)
}
我想用一个信号插槽连接它们中的每一个,它告诉我哪一个已经被检查过

有人能帮我吗?我真的不知道怎么做

谢谢
朱塞佩

这个问题有四种解决方案。我只描述最干净的可能性

最好的解决方案是实际使您的项目可检查。您可以通过使用
setFlags()
在项目上设置
Qt::ItemIsUserCheckable
标志来实现这一点,记住也要保留默认值

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);
}
QStringList-matID;
对于(inti=0;itableWidget->insertRow(ui->tableWidget->rowCount());
QTableWidgetItem*item=ui->tableWidget->getItem(ui->tableWidget->rowCount()-1,0);
item->setFlags(item->getFlags()| Qt::ItemIsUserCheckable);
}
然后,如中所述(ItemWidgets非常类似),您可以监听
itemChanged
并使用
checkState()
进行检查

其他方法将是:

  • 为列设置委托

  • 创建一个
    QSignalMapper
    以将自己的
    QCheckBox
    指针映射到标识行的某个值

  • 使用
    QObject::sender()
    member函数找出哪个复选框负责,并自行将其解析回行


只需添加for循环:
connect(复选框,&QCheckBox::stateChanged,[=](int state){qDebug(),谢谢,但就像你说的,我不能说哪一个被选中了:我总是得到2或0,无论哪个复选框被选中。我最好解释一下:我想发出一个信号,给我I的值(单击复选框所在的行号)您调用getCurrentRow,但这可能会失败,因为您插入了QCheckBox。因此,您需要采取变通办法