Методы ввода мешают QLineEdit получать KeyPressEvent?
Я отправляю эту ошибку команде Qt: http://bugreports.qt-project.org/browse/QTBUG-13726 и вот описание:
QLineEdit / QTextEdit не получает keyPressEvent на N97. У меня есть пользовательский виджет, который наследуется от QLinedEdit, в этом виджете я переопределяю событие (событие QEvent *), keyPressEvent(событие QKeyEvent *) и keyReleaseEvent(событие QKeyEvent *). Когда я отлаживаю код на устройстве N97, когда я нажимаю любую клавишу на клавиатуре, события доставляются следующим образом:
Событие (QEvent * events) вызывается с типом события, установленным в KeyRelease.
keyReleaseEvent(QKeyEvent * event) вызывается.
и keyPressEvent никогда не вызывался!!
если я нажимаю Enter, BackSpace, клавиши действий, влево, вправо, вниз, вверх, события доставляются следующим образом:
Событие (QEvent * events) вызывается с типом события, установленным в KeyPress.
keyPressEvent (QKeyEvent * event) вызывается.
Событие (QEvent * events) вызывается с типом события, установленным в KeyRelease.
keyReleaseEvent(QKeyEvent * event) вызывается.
что правильно.
Как воспроизвести:
#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 ответ
В 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), либо событие используется ранее в цепочке.