2

QTableView から Inherit クラス (A と呼びましょう) を書き込もうとしていますが、スロットを上書きしたいと考えています。

無効編集 ( const QModelIndex & index )

QAbstractItemView から。この関数が編集モードをトリガーできることは知っていますが、ここに私の質問があります。このクラス A でユーザーが編集モードをトリガーするたびに、プログラムが上書きされたスロットA::edit内に移動できることを願っています。

ただし、A::editが直接呼び出された場合にのみ、プログラムが入ることができるようです。

QTableView は QAbstractItemView に由来するため、編集モードが他の方法 (マウスのダブルクリックなど) によってトリガーされた場合、プログラムはA:: editの代わりにデフォルトのQAbstractItemView::editを実行します。

「アクティブ化された」信号を接続しようとしましたが、編集モードをトリガーする正しい信号ではないようです。エディターがトリガーされるたびに何かをする方法はありますか?

また、Enter キーや ESC キーを押すか、別の場所でマウスをクリックして編集モードを終了したときに何かをしたいと考えています。同じ状況がスロットで発生します

void editorDestroyed ( QObject * editor )

誰でもこの問題を解決するのを手伝ってもらえますか? 本当に感謝します、ありがとう!

4

1 に答える 1

5

QAbstractItemView :: edit(const QModelIndex&index)は仮想ではないため、直接呼び出すとサブクラスの動作を取得しますが、既存のコードを呼び出すと基本クラスの動作を取得します。それでもベルが鳴らない場合は、そのリンクを読んでください。Qtには多くの仮想関数と非仮想関数があり、その違いを知ることで多くの頭痛の種を減らすことができます。

ただし、QAbstractItemView :: edit(const QModelIndex&index、EditTrigger trigger、QEvent * event) 仮想であるため、オーバーライドできます。私はそれを検証していませんが、おそらく非仮想edit()がこのedit()を呼び出すので、同じ効果があるはずです。

QAbstractItemView :: editorDestroyed(QObject * editor)も仮想であるため、なぜ機能しないのかわかりません。ただし、仮想のQAbstractItemView :: closeEditor(QWidget *エディター、QAbstractItemDelegate :: EndEditHintヒント)もあるため、サブクラスで再実装してみてください。closeEditor()のドキュメントでは、commitData()も提案されています。これも仮想です。Qtアイテムビューには多くの同様のメソッドがあるため、最初に表示されるビューが希望/期待どおりに機能するとは限りません。

参考までに、サブクラスで仮想メソッドを再実装することに慣れていない場合、実装が呼び出されていることを確認する最も速くて簡単な方法は、次のようなことを行うことです。

class A : public QTableView {
    void closeEditor ( QWidget * editor, QAbstractItemDelegate::EndEditHint hint ) {
        qDebug("my closeEditor was called!");
        // call the real implementation so that the base class continues to work properly
        QTableView::closeEditor(editor, hint);
    }
};

edit()、editorDestroyed()、closeEditor()、およびcommitData()を使用してこれを実行し、いつ呼び出されるかを確認できます。

于 2012-09-12T02:32:03.883 に答える