私のプロジェクトでは、関数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、setModelData
get はcloseEditor
シグナルの前に呼び出されます。closeEditor
シグナルが最後に呼び出されたときに、どのようにデータをモデルに書き戻すのでしょうか? ここで何か不足していますか?