0

愚蠢的问题,但是大约一个小时我找不到摆脱这种废话的方法。我有一个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 数据)!我认为我必须以某种方式“更新”模型内容,但我无法从模型文档中找到正确的方法......

有什么帮助吗?

谢谢!

4

1 回答 1

2

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

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

于 2011-11-14T19:39:37.827 回答