2011-11-08 13 views
1

QAbstractTableModelに格納されている一連のデータを表示するQTableViewがあります。私はいつかデータを編集したいので、QStyledItemDelegateを使ってセルをダブルクリックすると(QTextEdit型の)エディタを作成します。しかし、私はキープレスイベントを自分で処理したいのですが、Text EditエディタでKey_Escapeを押すことはありません(EnterやAsciiなどの他のキーもキャプチャできます)。コードをチェックしたところ、EscapeはQTableViewのcloseEditor()関数に直接接続されていました。これは仮想メソッドであり、自動的に呼び出されます。私が知る限り、キープレスイベントはイベント処理の最下位層ですが、このような場合は当てはまりません。Qt:QStyledItemDelegateによって作成されたテキストエディットは、エスケープキープレスイベントを受け取ることができませんか?

私はそれを自分で処理できるように、エスケープキープレスイベントをキャプチャする必要があります、誰も私にこれを行う方法を教えてくれますか?ありがとう!

答えて

1

私は答えを得た、と私は他人を助けるだろうと思う:

オーバーライドQStyledItemDelegate :: eventFilter()メソッド:

MyItemDelegate::eventFilter(QObject* editor, QEvent* event) 
{ 
    if(event->type()==QEvent::KeyPress) 
      return false; 
    return QStyledItemDelegate::eventFilter(editor, event); 
} 

をQtのドキュメント、QStyledItemDelegateによる:: eventFilter()場合にtrueを返します。与えられたエディタは有効なQWidgetであり、指定されたイベントが処理されます。それ以外の場合はfalseを返します。 Tab、Backtab、Enter、Return、およびEcsはデフォルトで処理されます。そのため、KeyPressイベントを自分で処理する場合は、KeyPressイベントが発生したときにeventFilterをfalseに戻す必要があります。そのため、代わりにエディタのkeyPressEvent()メソッドが呼び出されます。

0

QStyledItemDelegate :: eventFilterは、可能性のbeacuseではありませんが、あなたがあなた自身のQEditLineをサブクラス化し、オーバーライドする:: keyPressEventがすべきイベントを取得するために

を保護された仮想です。コードに注意してください。 QLineEditorで編集しているものを知るために、私のQTableWidgetセルの実際の行と列を渡します。

//.h 
    class MyStyledItemDelegate : public QStyledItemDelegate 
    { 
    public: 
     MyStyledItemDelegate(QObject *parent = 0); 

     QWidget* createEditor(QWidget* parent,const QStyleOptionViewItem &option,const QModelIndex &index) const; 
    }; 

    //.cpp 
    #include "mylineedit.h" 

    MyStyledItemDelegate::MyStyledItemDelegate(QObject *parent) 
    :QStyledItemDelegate(parent) 
    { 
    } 

    QWidget* MyStyledItemDelegate::createEditor(QWidget* parent,const QStyleOptionViewItem &option,const QModelIndex &index) const 
    { 
     MyLineEdit* editor = new MyLineEdit(parent,index.row(),index.column()); 
     return editor; 
    } 

    ///////////////////////////////////////////////////////////// 
    //My own QLineEdit 
    ///////////////////////////////////////////////////////////// 

    //.h 
    class MyLineEdit : public QLineEdit 
    { 
     Q_OBJECT 
    public: 
     int _nRow; 
     int _nCol; 
    public: 

     MyLineEdit(QWidget *parent = 0,int nRow=-1, int nCol=-1); 
     virtual void keyPressEvent(QKeyEvent* event); 

    signals: 
     void mySignal(const QVector<QVariant> &); 

    public slots: 

    }; 

    //.cpp 

    MyLineEdit::MyLineEdit(QWidget *parent, int nRow,int nCol): 
     QLineEdit(parent) 
    { 
     _nRow=nRow; 
     _nCol=nCol;  
    } 
    ///////////////////////////////////////////////////////////////////////// 
    void MyLineEdit::keyPressEvent(QKeyEvent* event) 
    { 
     qDebug() << "MyLineEdit::OnKeyPressEvent:"<<event->text()<< " row="<<_nRow<<" col=" <<_nCol; 
     ///SET YOUR CODE HERE 
     QLineEdit::keyPressEvent(event); 
    } 

関連する問題