【问题标题】:QTableWidget dynamic row creationQTableWidget 动态行创建
【发布时间】:2013-01-23 14:47:36
【问题描述】:

我正在尝试在 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

非常感谢

【问题讨论】:

  • ui->tblRoles->setItem(0, 0, twl);当左上角项目更改时,您将在此处替换左上角项目。从链接的 UX 问题中,我收集到您想要附加一个新行。因此,请尝试使用 appendRow()。

标签: qt qtablewidget qtablewidgetitem


【解决方案1】:

所以经过一些研究,阅读文档后,这种有趣行为的原因或多或少是不言而喻的:

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 放在字体/颜色更改之前即可。

【讨论】:

    猜你喜欢
    • 2018-02-15
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    • 1970-01-01
    • 2020-07-24
    • 2019-05-14
    • 1970-01-01
    • 2020-04-12
    相关资源
    最近更新 更多