Qt: TextEdit, созданный QStyledItemDelegate, не может получить событие нажатия клавиши Escape? - PullRequest
1 голос
/ 08 ноября 2011

У меня есть QTableView для отображения группы данных, которые хранятся в QAbstractTableModel.Я также хочу когда-нибудь редактировать данные, поэтому я использую QStyledItemDelegate для создания редактора (типа QTextEdit), когда я дважды щелкаю по ячейке.Однако я хочу обработать событие нажатия клавиши самостоятельно, но я никогда не улавливаю нажатие клавиши Key_Escape в редакторе редактирования текста (другие клавиши, такие как Enter и Ascii, могут быть захвачены).Я проверил код и обнаружил, что Escape напрямую связан с функцией closeEditor () QTableView, которая является виртуальным методом и вызывается автоматически.Насколько я знаю, событие нажатия клавиши - это нижний уровень обработки события, но в этом случае это не так.

Мне нужно захватить событие нажатия клавиши Escape, чтобы я мог справиться с этим сам, может кто-нибудь сказать мне, как это сделать?Спасибо!

Ответы [ 2 ]

1 голос
/ 08 ноября 2011

Я получил ответ, и я думаю, что он поможет другим:

Переопределить метод 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 обрабатываются по умолчанию.Итак, если вы хотите обрабатывать событие нажатия клавиши самостоятельно, вы должны позволить eventFilter возвращать false, когда происходит событие KeyPress.Так что вместо этого будет вызываться метод редактора keyPressEvent ().

0 голосов
/ 10 апреля 2015

QStyledItemDelegate :: eventFilter невозможен, потому что виртуально защищен

Чтобы получить события, вы должны создать подкласс для своей собственной QEditLine и переопределить :: keyPressEvent там. Обратите внимание на код. Я передаю фактическую строку и столбец моей ячейки QTableWidget, чтобы узнать, что мы редактируем в переопределенном QLineEditor.

</p> <pre><code> //.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); }

...