のデフォルトの編集動作を拡張するのに問題がありますQTableView
。Enter キーが押されたときの次の動作が必要です。
- まだ編集されていない場合は、現在のセルの編集を開始します。
- セルが編集中の場合、
- 2a. データをコミットしてエディターを閉じます。それで、
- 2b. 下のセルが存在する場合は、現在のセルにします。
2a はデフォルトの動作であり、2b は (同様のコンテキストでここで提案されているように)QAbstractItemView::setCurrentIndex()
の再実装で使用することで実現できる可能性があります。QItemDelegate::eventFilter()
問題は 1 を達成することです。これまでに試したアプローチを以下に示します。
- 「プラットフォーム編集キー」の再設定 デフォルトでは、「アイテム上でプラットフォーム編集キーが押されると編集が開始されます」。(
QAbstractItemView::EditKeyPressed
) このキーは、私のプラットフォーム (Ubuntu 12.04) では F2 です。プラットフォームの編集キーを Enter に再構成することはできましたが、- プラットフォームのデフォルトを変更するのは悪い考えのようです。
- 私はそれを行う方法を見つけることができませんでした。
QShortCut
次のようにこれを行うために使用するEnter キーの押下をキャプチャします。class CourseTable : public QTableView { /* ... */ }; /* ... */ CourseTable::CourseTable(/* ... */) { /* ... */ QShortcut* shortcut = new QShortcut(QKeySequence(Qt::Key_Return), this); connect(shortcut, SIGNAL(activated()), this, SLOT(handleEnter_())); /* ... */ } /* ... */ void CourseTable::handleEnter_() { QModelIndex idx = this->currentIndex(); if (this->state() != QAbstractItemView::EditingState) this->edit(idx); /* else // see below */ }
これは Enter キーの押下をキャプチャし、(上から) 1 を達成しますが、現在 2 は壊れています。したがって、上記の
else
節を調べてCourseTable::handleEnter_()
、おそらくQAbstractItemView::commitData()
andQAbstractItemView::closeEditor
を呼び出す必要があります。問題は、これらの関数の両方がQWidget *editor
引数を必要とすることです。これを取得する方法がわかりません。をサブクラス化し、派生クラスにメソッドをQAbstractItemDelegate
追加し、getEditor()
既存のコードを変更して派生デリゲート クラスのインスタンスをCourseTable::setItemDelegate*()
関数に渡すことができます。しかし、それはあまりにも多くの仕事のように聞こえます。
では、コードを書き直すことなく、1 と 2 の両方をきれいに達成する方法はありますか?