• 6100阅读
  • 4回复

如何使 Key_Escape 在 QLineEdit 中 起作用? [复制链接]

上一主题 下一主题
离线wneunfn
 

只看楼主 正序阅读 楼主  发表于: 2007-05-22
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, 一按程序就直接退出了,请问该如何做才能达到目标?
[ 此贴被wneunfn在2007-05-22 15:16重新编辑 ]
离线wneunfn

只看该作者 4楼 发表于: 2007-06-06
是这个机制,问题是,你需要更改这个类的所有实例的键盘响应,而不只是实例中的某一个特例,而且要在所有用到这个类的程序中,保证所有的键盘反应都是一样的……

“外面的容器”无法保证这些要求。
离线mzl626

只看该作者 3楼 发表于: 2007-06-03
Key_Escape 键应该是被外面的容器获得了,你应该对外面的容器进行事件处理,让他向获得焦点的Widget也就是LineEdit发送按键事件!
离线wneunfn

只看该作者 2楼 发表于: 2007-05-30
是啊,是传不进去的,安装事件过滤器也没用,最后还是自定义了一个键才解决:
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);
          return QLineEdit::event((QEvent *)&ke3);
                break;
            }
        default:
            return QLineEdit::event(e);
        }
    }
    return QLineEdit::event( e );
}
离线shiroki

只看该作者 1楼 发表于: 2007-05-25
你说的keyescape指的是什么键? 是qtopia下面contextbar上的键吗?这个键值本来就是先contextbar收到,根本就传不到lineedit里的哦...
--
shiro is White
ki is tree
http://www.cuteqt.com
论坛 http://www.cuteqt.com/bbs
博客 http://www.cuteqt.com/blog
博客镜像: http://sites.cuteqt.com/cuteqt
Linux/Qt/嵌入式讨论群 http://qun.qq.com/air/5699823
快速回复
限100 字节
 
上一个 下一个