输入法是否阻止 QLineEdit 接收 KeyPressEvent?
我将此错误发送给 Qt 团队: http://bugreports.qt-project.org/browse/QTBUG-13726 这是描述:
QLineEdit/QTextEdit does not receive keyPressEvent on N97 我有一个继承自 QLinedEdit 的自定义小部件,在这个小部件中我覆盖 event(QEvent * event)、keyPressEvent(QKeyEvent *event) 和 keyReleaseEvent(QKeyEvent *event )。当我在 N97 设备上调试代码时,当我按键盘上的任意键时,事件将按如下方式传递:
event(QEvent * events) 被调用,事件类型设置为 KeyRelease。
keyReleaseEvent(QKeyEvent *event ) 被调用。
并且 keyPressEvent 从未被调用!
如果我按 Enter、BackSpace、操作键、左、右、下、上,事件将按如下方式传递:
event(QEvent * events) 被调用,事件类型设置为 KeyPress。
keyPressEvent(QKeyEvent *event ) 被调用。
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() 但没有成功。
I send this bug to Qt team:
http://bugreports.qt-project.org/browse/QTBUG-13726
and here is the description:
QLineEdit/QTextEdit doesn't receive keyPressEvent on N97
I have a custom widget which inherits from QLinedEdit, in this widget I override event(QEvent * event), keyPressEvent(QKeyEvent *event) and keyReleaseEvent(QKeyEvent *event ). When I debugged the code on N97 device, when I press any key on the keypad the events are delivered as follows:
event(QEvent * events) gets called with event type set to KeyRelease.
keyReleaseEvent(QKeyEvent *event ) gets called.
and keyPressEvent was never called !!
if I press Enter, BackSpace, action keys, left, right, down, up, the events are delivered as follows:
event(QEvent * events) gets called with event type set to KeyPress.
keyPressEvent(QKeyEvent *event ) gets called.
event(QEvent * events) gets called with event type set to KeyRelease.
keyReleaseEvent(QKeyEvent *event ) gets called.
which is correct.
How to reproduce:
#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); }
}
The same problem appears if I inherits from the QTextEdit
and I've got this replay:
Isn't that just because of the input methods?
can anyone explain to me what he means by "input methods", and how it is related to the received events, I tried with setInputMethodHints() and inputMethodEvent() without success.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
在 Symbian 上,Window 服务器将按键事件发送到 FEP(前端处理器),FEP 反过来向控件询问其输入功能(请参阅 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 和 TCoeInputCapability)。我认为这就是错误报告的评论所指的内容。
Symbian 中的 OfferKeyEventL 功能是作为责任链实现的,这意味着如果链中的某个控件可以处理按键事件,则该事件将被消耗,链中的后续控件将不会意识到它。
因此,要么由于未设置输入功能而导致事件被 FEP 丢弃(尽管我不知道如何通过 Qt 设置它们),要么事件在链的早期被消耗。
On Symbian, the Window server sends key events to the FEP (Front End Processor) which in turn asks the control for its input capabilities (see 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, and TCoeInputCapabilities). I think this is what the comment to the bug report referred to.
The OfferKeyEventL functionality in Symbian is implemented as a Chain of Responsibility, which means that if a control in the chain can handle the key event, it is consumed and subsequent controls in the chain will not be aware of it.
So, either the event is discarded by the FEP due to input capabilities not being set (though I do not know how to set them through Qt) or the event is consumed earlier in the chain.