2016-04-11 10 views
2

私はQAbstractTableModelからサブクラス化された私自身のテーブルモデルを持っています。それは私のビュー(サブクラスQTableView)にインストールされています。ビューの内部では、アイテムを編集するためにデリゲートクラス(サブクラスQItemDelegate)を使用しています。QItemDelegate、closeEditor()シグナルで自分のEndEditHintを提供する方法は?

デリゲートを使用してデータを編集すると、モデルの次の項目(次の行と同じ列の項目)が編集可能になります。

QAbstractItemDelegate::EditNextItemヒントがcloseEditor()シグナルで送信されていることを示しています。しかし、デフォルトでは、この信号はQAbstractItemDelegate::NoHintパラメータで送信されます。問題は、たとえばsetModelData()のように、基本的なQItemDelegate仮想関数を再実装する際に、この信号を明示的に呼び出す必要がないことです。

ドキュメントも、この信号はQAbstractItemDelegate()コンストラクタを呼び出し中にアイテムデリゲートにインストールされている内部イベントフィルタによって送信されることを言います。

私は自分のEndEditHintcloseEditor()シグナルにどうやって提供できますか?

答えて

0

編集が完了すると、デリゲートはSubmitModelCacheヒントのcloseEditor()信号を送信します。モデルを適切に更新するには、この動作を維持する必要があります。あなたがQItemDelegate::eventFilter()を再実装でき、前の編集からのデータをコミットした後

次のセルですぐに開いて編集者に私はちょうどQAbstractItemView::closeEditor()方法再実装する多くは、より簡単に見つける:でも簡単に解決策は以下のようになり

void CMyTableView::closeEditor(QWidget *editor, QAbstractItemDelegate::EndEditHint hint) 
{ 
    QTableView::closeEditor(editor, hint); 

    QModelIndex index = moveCursor(MoveNext, Qt::NoModifier); 
    if (!index.isValid()) 
     return; 

    QPersistentModelIndex persistent(index); 
    selectionModel()->setCurrentIndex(persistent, flags); 

    // currentChanged signal would have already started editing 
    if (index.flags() & Qt::ItemIsEditable && (!(editTriggers() & QAbstractItemView::CurrentChanged))) 
     edit(persistent); 
} 

を(私はそれについてはよく分からないですが、それは間違いなく試してみる価値はあります):

void CMyTableView::closeEditor(QWidget *editor, QAbstractItemDelegate::EndEditHint hint) 
{ 
    QTableView::closeEditor(editor, hint); 
    QTableView::closeEditor(nullptr, QAbstractItemDelegate::EditNextItem);  
} 

moveCursor()方法は、次の列と同じ行のインデックスを返します。あなたはこの動作を変更したい場合は、それを再実装:

QModelIndex CMyTableView::moveCursor(CursorAction action, Qt::KeyboardModifiers modifiers) 
{ 
    if (action == QAbstractItemView::MoveNext) 
     action = QAbstractItemView::MoveDown; 
    else if (action == QAbstractItemView::MovePrevious) 
      action = QAbstractItemView::MoveUp; 

    // Next row, same column. 
    return QTableView::moveCursor(action, modifiers); 
} 

ところで:あなたがタブキーを押すと、デフォルトQTableView動作は、データが保存され、次回、現在のエディタが閉じているということですセルが編集されます。
あなたがしなければならないのは、ちょうどQTableView::moveCursor()メソッドを再実装するだけです。

関連する問題