今天在设计界面的时候,甲方要求需要在表格中添加进去复选框。
至于添加复选框的方式还是很简单的,直接使用setCellWidget函数即可。但是后面当我想通过“表格”的“item”的“点击”获得这个cell的信号的时候,发现不可以,会出现部分地区失灵的情况.
后来经过测试,发现原因是由于item的部分地区被cellWidget占用,从而导致item的信号失灵。
画个草图如下:
从上图可以看出,一个item中,因为添加了一个cellWidget的缘故,导致部分空间被cellWidget占用,这就导致在点击属于cellWidget部分的空间时,无法触发item的点击信号,只有在点击item这部分的空间的时候,才能够正常触发。
至于这个cellWidget所占的空间的大小问题,因为实验样本比较少,就没法列出确切的大小或者是比例,这里就不多加赘述,读者如果有兴趣可以自己去测试一下这个空间所占的大小的比例关系。
至于如何结局这个问题,在请教了同事之后,发现了一个非常不错的解决方案。
以下以QCheckBox为例,作为讲解,目的是在QTableWidget中添加一个QCheckBox组件,然后通过QCheckBox的复选状态,自动刷新QCheckBox的文字(测试用,比较简单)。
//在QTableWidget的第0列添加QCheckBox作为cellWidget
ui->tableWidget->insertRow(ui->tableWidget->rowCount());
ui->tableWidget->setCellWidget(ui->tableWidget->rowCount()-1, 0, new QCheckBox(QStringLiteral("未选中"));
connect(reinterpret_cast<QCheckBox*>(ui->tableWidget->cellWidget(ui->tableWidget->rowCount()-1, 0),
&QCheckBox::stateChanged, this, &XXX::OnCbStateChangedSlot);
注意,这里采用的是,在创建这个QCheckBox的时候,就利用connect进行信号槽连接的方式。
以下是该槽函数:
void XXX::OnCbStateChangedSlot()
{
QCheckBox *pCb = reinterpret<QCheckBox*>(sender());
if (pCb->isChecked())
{
pCb->setText(QStringLiteral("已选中"));
}
else
{
pCb->setText(QStirngLiteral("未选中"));
}
}
解决的思路在于,将专注点从QTableWidget的item转向了自己所安插的cellWidget本身,通过在添加cellWidget的时候就进行信号槽连接的方式,同时借用sender函数,就可以跳过QTableWidget进行完美的操作。
这里没啥多余的想要说的,就是想介绍一下sender()函数,这点虽然在以往的博客中提到过,但是这次我还是没想起来用(捂脸,爆哭),这里就是想给自己添加一个印象,要学会使用sender函数。