Как добавить к QStandardItemModel метод после метода setModel ()? - PullRequest
0 голосов
/ 14 ноября 2011

Глупый вопрос, но я не могу найти выход из этого дерьма около часа. У меня есть QTableView виджет, пытающийся добавить строки с QStandardItemModel. In 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 Ответ

2 голосов
/ 14 ноября 2011

Код создания и добавления элементов в модель выглядит правильно.

Если SignalBlocker делает то, что я подозреваю, он делает, я полагаю, это вызывает ваши проблемы. Когда вы добавляете элементы, модель излучает сигналы, к которым подключается представление, и обновляется по мере добавления элемента. Если вы позвоните на модель blockSignals(true), вы предотвратите передачу любых сигналов, и представление не будет уведомлено об изменениях.

...