Методы ввода мешают QLineEdit получать KeyPressEvent? - PullRequest
1 голос
/ 24 сентября 2010

Я отправляю эту ошибку команде Qt: http://bugreports.qt -project.org / browse / QTBUG-13726 и вот описание:

QLineEdit / QTextEdit не получает keyPressEventна N97 у меня есть собственный виджет, который наследуется от QLinedEdit, в этом виджете я переопределяю событие (событие QEvent *), keyPressEvent (событие QKeyEvent *) и keyReleaseEvent (событие QKeyEvent *).Когда я отлаживаю код на устройстве N97, когда я нажимаю любую клавишу на клавиатуре, события доставляются следующим образом:

  1. событие (события QEvent *) вызывается с типом события, установленным в KeyRelease.

  2. вызывается keyReleaseEvent (событие QKeyEvent *).

и никогда не вызывается keyPressEvent !!

, если я нажимаюEnter, BackSpace, клавиши действий, влево, вправо, вниз, вверх, события доставляются следующим образом:

  1. событие (QEvent * events) вызывается с типом события, установленным в KeyPress.

  2. вызывается keyPressEvent (событие QKeyEvent *).

  3. событие (события QEvent *) вызывается с типом события, установленным в KeyRelease.

  4. вызывается keyReleaseEvent (событие QKeyEvent *).

, что правильно.

Как воспроизвести:

#include <QKeyEvent>
#include <QMessageBox>
#include <QLineEdit>
#include <QTextEdit>
#include <QDebug>


class MyWidget : public QLineEdit { Q_OBJECT public: MyWidget(QWidget *parent=0); void keyPressEvent(QKeyEvent * event); void keyReleaseEvent(QKeyEvent * event ); bool event(QEvent *event); };

MyWidget::MyWidget(QWidget *parent)
:QLineEdit(parent)

{ setText("Hola"); }
void MyWidget::keyPressEvent(QKeyEvent *event) { QLineEdit::keyPressEvent(event); }

void MyWidget::keyReleaseEvent(QKeyEvent *event ) { QLineEdit::keyReleaseEvent(event); }

bool MyWidget::event(QEvent *event ) {
switch( event->type() ) { case QEvent::KeyPress: QLineEdit::event(event); break; case QEvent::KeyRelease: QLineEdit::event(event); break; default: QLineEdit::event(event); }

}

Та же проблема возникает, если я наследую от QTextEdit

и у меня есть этот повтор:

Разве это не только из-за методов ввода?

Может кто-нибудь объяснить мне, что он подразумевает под "методами ввода", и как это связано с полученнымсобытия, которые я попытался с setInputMethodHints () и inputMethodEvent () без успеха.

1 Ответ

1 голос
/ 28 сентября 2010

В Symbian сервер Window отправляет ключевые события в FEP (Front End Processor), который, в свою очередь, запрашивает у элемента управления свои возможности ввода (см. http://developer.symbian.org/main/documentation/reference/s3/pdk/GUID-FCEDC338-61CA-5D10-A8DB-E44A3EBBDE5E-GENID-1-10-1-3-1-1-9-1-3-1.html, и TCoeInputCapabilities).Я думаю, что это то, на что ссылался комментарий к сообщению об ошибке.

Функциональность OfferKeyEventL в Symbian реализована как цепочка ответственности, что означает, что если элемент управления в цепочке может обрабатывать ключевое событие, этопотребленные и последующие элементы управления в цепочке не будут знать об этом.

Итак, либо FEP отбрасывает событие из-за невозможности установить входные возможности (хотя я не знаю, как установить их через Qt)или событие используется ранее в цепочке.

...