0

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()、通常は 3 つの乱数の行が作成されます...

これを機能させる方法はありますか?

背景情報: 私はこれを実装しようとしています: https://ux.stackexchange.com/questions/33331/about-the-creation-and-management-of-items

どうもありがとう

4

1 に答える 1

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 つの呼び出しのにシグナルをブロックするため、明らかに 2 つの余分な行が得られます。

したがって、blockSignalsフォント/色が変更される前に配置すると機能します。

于 2013-01-24T08:33:40.760 に答える