Qt键盘事件属于Qt事件系统,所以事件系统中所有规则对按键事件都有效。下面关注点在按键特有的部分:
一个拥有焦点(focus)的QWidget才可以接受键盘事件。有输入焦点的窗口是活动窗口或活动窗口子窗口或子子窗口等。
焦点移动的方式有以下几种:
注意:文本编译器(一般需要插入Tab),或者WebView(需要Tab来移动超链接焦点) 等
注意:如果一个 Widget 已经 grabKeyboard,所有键盘事件将发送到该Widget而不是获得焦点的Widget
一个QWidget获得焦点的方式受 focusPolicy 控制
首先,我们要是Widget获得焦点,一般设置focusPolicy。
然后要对按键进行响应,我们只需要直接重载:
注意:
在windows下,与键盘事件有关的有8个消息:
这些消息在Qt中只体现在QKeyEvent中。
实际程序:
public: void keyPressEvent(QKeyEvent *event);
在相应键盘事件之前需要 用一个widget 进行设置 LabelComment->setFocusPolicy(Qt::StrongFocus);
void CameraShow::keyPressEvent(QKeyEvent *event)
{
if(event->key()==Qt::Key_Q)
{
Pause_flag ^= 1;
}
}
还有资料:(QTextBrowser的网址切换)
http://hi.baidu.com/%D7%D4%D3%EF%B5%C4%C2%E6%CD%D5/blog/item/2758cf13d83f945df819b806.html
在Qt中,可以使用 void QWidget::keyPressEvent ( QKeyEvent * k )来进行键盘响应,例如:
void Form1::keyPressEvent( QKeyEvent *k )
{
if(k->key() == Key_A)
{
this->focusNextPrevChild(FALSE);//按A时焦点切换至上一部件
}
else if(k->key() == Key_D)
{
this->focusNextPrevChild(TRUE);//按D时焦点切换至下一部件
}
else if(k->key() == Key_W)
{
if(k->state() == Qt::ShiftButton)
{
this->resize(100,100);//当按下Shift+W时改变窗口大小
}
}
}
但是,有一些特殊的按键比如说Tab键,如果在keyPressEvent中实现则是不能成功的,因为默认Tab事件(切换焦点)被先捕获了,默认Tab和Shift+Tab事件定义在qwidget.h中,代码为:
case QEvent::KeyPress: {
QKeyEvent *k = (QKeyEvent *)e;
bool res = FALSE;
if ( k->key() == Key_Backtab ||
(k->key() == Key_Tab &&
(k->state() & ShiftButton)) ) {
QFocusEvent::setReason( QFocusEvent::Tab );
res = focusNextPrevChild( FALSE );
QFocusEvent::resetReason();
} else if ( k->key() == Key_Tab ) {
QFocusEvent::setReason( QFocusEvent::Tab );
res = focusNextPrevChild( TRUE );
QFocusEvent::resetReason();
}
}
所以我们要在之前就实现我们自己的Tab事件.实现代码如下:
bool MyWidget::event(QEvent *event)
{
if (event->type() == QEvent::KeyPress) {
QKeyEvent *ke = static_cast(event);
if (ke->key() == Qt::Key_Tab) {
// special tab handling here
return true;
}
} else if (event->type() == MyCustomEventType) {
MyCustomEvent *myEvent = static_cast(event);
// custom event handling here
return true;
}
return QWidget::event(event);
}
QTextBrowser中的网址切换
void ALMTextView::keyPressEvent(QKeyEvent* e)
{
AMDEBUG("ALMTextView special key event/n");
QScrollBar *sbv = verticalScrollBar();
switch( e->key() ) {
//case Key_Right:
case Key_Down:
if ( !selectNextPrevHref( TRUE ) )
{
// scroll the screen down by one page
if (sbv->value() == sbv->maxValue())
{
printf("asdasdasdasdasdasda/n");
this->focusNextPrevChild(TRUE);
}
sbv->setValue( sbv->value() + (sbv->pageStep() >> 1) );
selectNextPrevHref( TRUE );
}
e->accept();
return;
//case Key_Left:
case Key_Up:
if ( !selectNextPrevHref( FALSE ) ){
// scroll the screen up by one page
if(sbv->value() == 0)
{
printf("1234567890/n");
this->focusNextPrevChild(FALSE);
}
sbv->setValue( sbv->value() - (sbv->pageStep() >> 1) );
selectNextPrevHref( FALSE );
}
e->accept();
return;
}
QTextView::keyPressEvent(e);
}