在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)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); } |
|