私のプロジェクトでは、関数QStyledItemDelegateからカスタム エディターをサブクラス化して返しました。createEditor
QWidget* TagEditDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
TagEditWidget* tagEditWidget = new TagEditWidget(parent, index.data(Qt::UserRole+4).toInt(), index.data(Qt::UserRole+2).toByteArray(), index.data(Qt::UserRole+3).toByteArray(), index.parent().data(Qt::UserRole+4).toInt() == 9, parent->width());
return tagEditWidget; //tagEditWidget is my custom QWidget
}
編集が終わったら、新しいデータをモデルに書き戻したいです。だから私はオーバーライドしsetModelDataました。
void TagEditDelegate::setModelData(QWidget * editor, QAbstractItemModel * model, const QModelIndex & index) const
{
TagEditWidget * tagEditWidget = qobject_cast<TagEditWidget*>(editor);
if (!tagEditWidget)
{
QStyledItemDelegate::setModelData(editor, model, index);
return;
}
//Edit model here?
}
これは機能しますが、問題はsetModelData、エディターがどのように閉じられても呼び出されることです。EndEditHint、を使用してエディターを閉じた場合にのみ、新しいデータを書き込みたいですQAbstractItemDelegate::SubmitModelCache。そこで、closeEditor信号を という名前のスロットに接続しましたeditFinished。
connect(this, SIGNAL(closeEditor(QWidget*,QAbstractItemDelegate::EndEditHint)), this, SLOT(editFinished(QWidget*,QAbstractItemDelegate::EndEditHint)));
これで、エディターを介してエディターがどのように閉じられたEndEditHintか、およびデータをモデルに書き戻す必要があるかどうかを確認できるようになりました。Buuuuut、setModelDataget はcloseEditorシグナルの前に呼び出されます。closeEditorシグナルが最後に呼び出されたときに、どのようにデータをモデルに書き戻すのでしょうか? ここで何か不足していますか?