0

のデフォルトの編集動作を拡張するのに問題がありますQTableView。Enter キーが押されたときの次の動作が必要です。

  1. まだ編集されていない場合は、現在のセルの編集を開始します。
  2. セルが編集中の場合、
    • 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 の両方をきれいに達成する方法はありますか?

4

1 に答える 1

2

編集を開始するためにもイベントをフィルタリングできないのはなぜですか?

状態が != QAbstractItemView::EditingState の場合、イベントを処理するだけです

この関数で true を返すと、フィルタリングされたオブジェクトへのイベントの伝播が停止します。

状態が編集中の場合は、false を返すだけで、テーブルとエディターがイベントの処理を続行できるようになります。

このようなもの:

 bool FilterObject::eventFilter(QObject *object, QEvent *event)
 {
   if (object == tableView && event->type() == QEvent::KeyPress) {
       QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
       if (keyEvent->key() == Qt::Key_Return && tableView->state() != QAbstractItemView::EditingState) {
           // set current cell to edit
         return true;
       } else
         return false;
   }
   return false;
 }
于 2012-12-10T15:35:14.103 に答える