• 5129阅读
  • 2回复

keyPressEvent问题 [复制链接]

上一主题 下一主题
离线map_j
 
只看楼主 倒序阅读 楼主  发表于: 2006-08-15
想接收键盘的响应
void keyPressEvent( QKeyEvent *k )
{
cout << "ok" << endl;
}
只有焦点在窗体上的时候才好用
但现在焦点在一个文本框上就不好用了
能把文本框和键盘事件绑定吗?
我现在只能判断文本框内容改变时处理,很麻烦
[ 此贴被XChinux在2006-08-15 21:17重新编辑 ]
离线ediwon
只看该作者 1楼 发表于: 2006-08-15
用win32 api挂勾子
貌似是这样吧。
BLOG:
http://www.ediwon.com
-------------------------------
离线ericguo
只看该作者 2楼 发表于: 2006-08-16
楼上的回答当然是可行的,只是不太实际

其实可以通过重载QWidget::keyPressEvent()获得本类(假设是窗体)中的几乎所有键盘事件,但焦点在文本框上,就不属于窗体类啦,所以必须采用在窗体类中添加Event Filters:

CustomerInfoDialog::CustomerInfoDialog(QWidget *parent)
  : QDialog(parent)
{
  ...
  firstNameEdit->installEventFilter(this);
  lastNameEdit->installEventFilter(this);
  cityEdit->installEventFilter(this);
  phoneNumberEdit->installEventFilter(this);
}


然后在eventFilter中处理相关键盘事件,通过target判断是否是文本框发生的键盘事件

bool CustomerInfoDialog::eventFilter(QObject *target, QEvent *event)
{
  if (target == firstNameEdit || target == lastNameEdit
        || target == cityEdit || target == phoneNumberEdit) {
    if (event->type() == QEvent::KeyPress) {
        QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
        if (keyEvent->key() == Qt::Key_Space) {
          focusNextChild();
          return true;
        }
    }
  }
  return QDialog::eventFilter(target, event);
}

上面回答看起来精彩,但其实只是照抄C++ GUI Programming with Qt4的第七章内容而已……
快速回复
限100 字节
 
上一个 下一个