标题:如何使 Key_Escape 在 QLineEdit 中 起作用?
作者:wneunfn
日期:2007-05-22 15:09
内容:
class Q_EXPORT myLineEdit: public QLineEdit
在类中:
void myLineEdit::keyPressEvent(QKeyEvent *e)
{
switch(e->key())
{
case Key_Escape:
{
if (edited() && cursorPosition() > 0)
{
QKeyEvent ke(QEvent::KeyPress, Key_BackSpace, Key_BackSpace, 0);
QLineEdit::keyPressEvent( &ke );
}
else
{
QLineEdit::keyPressEvent( e );
}
break;
}
default:
QLineEdit::keyPressEvent( e );
}
}
bool myLineEdit::event( QEvent * e)
{
if ( e->type() == QEvent::KeyPress)
{
QKeyEvent* ke = (QKeyEvent*) e;
if(ke->key() == Key_Escape)
{
//ke->ingore();
ke->accept();
//return QWidget::event( e );
//return true;
}
}
return QLineEdit::event( e );
}
结果发现根本捕获不到Key_Escape, 一按程序就直接退出了,请问该如何做才能达到目标?
#1 [shiroki 05-25 22:56]
你说的keyescape指的是什么键? 是qtopia下面contextbar上的键吗?这个键值本来就是先contextbar收到,根本就传不到lineedit里的哦...
#2 [wneunfn 05-30 16:46]
是啊,是传不进去的,安装事件过滤器也没用,最后还是自定义了一个键才解决:
bool myLineEdit::event(QEvent * e)
{
if( e->type() == QEvent::KeyPress )
{
QKeyEvent * k = (QKeyEvent*) e;
switch(k->key())
{
case KEY_OK:
{
k->ignore();
break;
}
case KEY_CANCEL:
{
if (edited() && cursorPosition() > 0)
{
QKeyEvent ke(QEvent::KeyPress, Key_BackSpace, Key_BackSpace, 0);
return QLineEdit::event((QEvent *)&ke);
}
else
{
QKeyEvent ke1(QEvent::KeyPress, Key_Escape, Key_Escape, 0);
return QLineEdit::event((QEvent *)&ke1);
}
break;
}
case Key_Up:
{
QKeyEvent ke2(QEvent::KeyPress, Key_BackTab, Key_BackTab, 0);
return QLineEdit::event((QEvent *)&ke2);
break;
}
case Key_Down:
case Key_Enter:
case Key_Return:
{
QKeyEvent ke3(QEvent::KeyPress, Key_Tab, Key_Tab, 0);
&nb ..
#3 [mzl626 06-03 12:58]
Key_Escape 键应该是被外面的容器获得了,你应该对外面的容器进行事件处理,让他向获得焦点的Widget也就是LineEdit发送按键事件!
#4 [wneunfn 06-06 09:30]
是这个机制,问题是,你需要更改这个类的所有实例的键盘响应,而不只是实例中的某一个特例,而且要在所有用到这个类的程序中,保证所有的键盘反应都是一样的……
“外面的容器”无法保证这些要求。