我正在尝试在itemChanged信号的QTableWidget中创建一个新行。这是代码:
Constructor::
{
ui->tblRoles->insertRow(0);
QTableWidgetItem *twl = new QTableWidgetItem("New Role");
QFont f = twl->font();
f.setItalic(true);
twl->setFont(f);
twl->setForeground(Qt::gray);
ui->tblRoles->setItem(0, 0, twl);
QObject::connect(ui->tblRoles, SIGNAL(itemChanged(QTableWidgetItem*)),
this, SLOT(newRole(QTableWidgetItem*)));
}
上面为表创建了一个初始行,并将信号连接到插槽。下面的插槽检查这是否是更改的正确单元格,如果是更新它,并创建一个新行...至少它应该这样做:
void RoleListingForm::newRole(QTableWidgetItem *itm)
{
if(itm->row() == 0 && itm->column() == 0)
{
QFont f = itm->font();
f.setItalic(false);
itm->setFont(f);
itm->setForeground(Qt::black);
ui->tblRoles->blockSignals(true); //////
ui->tblRoles->insertRow(0);
QTableWidgetItem *twl = new QTableWidgetItem("New Role");
f = twl->font();
f.setItalic(true);
twl->setFont(f);
twl->setForeground(Qt::gray);
ui->tblRoles->setItem(0, 0, twl);
ui->tblRoles->blockSignals(false); /////
}
}
如果我删除blockSignals()
,代码会进入无限循环,如果我离开blockSignals()
,它会创建一个随机数量的行,通常是三行......
任何想法如何使这项工作?
背景信息:我正在努力实现这一点:https://ux.stackexchange.com/questions/33331/about-the-creation-and-management-of-items
非常感谢
答案 0 :(得分:0)
经过一些研究,在阅读文档后,这种有趣行为的原因或多或少是不言而喻的:
void QTableWidget::itemChanged ( QTableWidgetItem * item ) [signal] This signal is emitted whenever the data of item has changed.
发生的事情如下:
我打电话:
itm->setFont(f);
itm->setForeground(Qt::black);
但是这两个都被Qt转换为“数据”变化,并且由于我在这两个调用之后阻塞了信号,显然我得到了2个额外的行。
因此,在字体/颜色更改之前放置blockSignals
并且它可以正常工作。