如何在设置Model()方法后将Row附加到QStandardItemModel?

时间:2011-11-14 15:02:25

标签: qt qt4 qstandarditemmodel

愚蠢的问题,但我找不到这个废话约一个小时的出路。我有一个QTableView小部件,尝试添加QStandardItemModel行。在ctor之前,

tableView->setModel( MyStandardItemModel );

我运行此功能:

void MyDialog::addItem( const SomeSection& section )
{
     SignalBlocker< QStandardItemModel > blocker( model_ );

     QStandardItem* visibilityItem = new QStandardItem;
     visibilityItem->setCheckable( true );
     visibilityItem->setCheckState( !section.hidden ? Qt::Checked : Qt::Unchecked );
     visibilityItem->setData( QVariant::fromValue( section ), Qt::UserRole + 1 );

     QStandardItem* descriptionItem = new QStandardItem( section.name );

     QStandardItem* signatureItem = new QStandardItem;
     if( section.sign )
     {
          signatureItem->setToolTip( tr( "Требует подписи" ) );
          signatureItem->setIcon( QIcon( ":/signatures/images/signatures/check-sgn.png" ) );
     }

     model_->appendRow( StandardItemList() << visibilityItem << descriptionItem << signatureItem );
}

PS:StandardItemList只是typedef QList< QStandardItem* > StandardItemList;


首先,我制作了一些addItem()'s然后setModel(),所有行都在表格中可见。 但是当我试图稍后追加另一行时(此时点击按钮),

addItem( MyNewSection );

我没有看到QTableView窗口小部件中的更改(没有新行,也没有新的MyNewSection数据)!我认为我必须以某种方式“更新”模型内容,但我无法从模型文档中找到正确的方法...

任何帮助?

谢谢!

1 个答案:

答案 0 :(得分:2)

创建代码并将其添加到模型中的代码看起来是正确的。

如果SignalBlocker做了我怀疑它做的事情,我想这会引起你的麻烦。 当您添加项目时,模型会发出视图连接的信号,并在添加项目时进行更新。如果您在模型上调用blockSignals(true),则会阻止发出任何信号,并且不会通知视图更改。