今天在编写代码的时候,发现重载键盘事件的时候无法获取到上下左右键盘案件的消息,百度后才知道是因为我窗口上面有很多控件,获取了键盘的事件。
我的做法就是让这些按控件都不要焦点
看下代码吧
void ControlPanel::keyPressEvent(QKeyEvent *event) { switch (event->key()) { case Qt::Key_Control: { controlIsPressed = true; m_maincontrol->setKeyBordPressed(key_Control); break; } case Qt::Key_Down: m_maincontrol->setKeyBordPressed(Key_Down); break; case Qt::Key_Left: m_maincontrol->setKeyBordPressed(key_Left); break; case Qt::Key_Right: m_maincontrol->setKeyBordPressed(key_Right); break; case Qt::Key_Up: m_maincontrol->setKeyBordPressed(key_Up); break; default: break; } } void ControlPanel::keyReleaseEvent(QKeyEvent *event) { switch (event->key()) { case Qt::Key_Control: { controlIsPressed = false; m_maincontrol->setKeyBordRelease(key_Control); break; } case Qt::Key_Down: m_maincontrol->setKeyBordRelease(Key_Down); break; case Qt::Key_Left: m_maincontrol->setKeyBordRelease(key_Left); break; case Qt::Key_Right: m_maincontrol->setKeyBordRelease(key_Right); break; case Qt::Key_Up: m_maincontrol->setKeyBordRelease(key_Up); break; default: break; } }
这里呢,我的展示界面放是这个子控件的子控件,多以我在写的时候,要想不被他们吧我的键盘事件拦截了,我得把其他的控件都设置成没有交点,这样开可以将我的键盘事件传递到最下面来。
具体展现方式很简单,就是根据现有的信号,做下图片资源的替换工作。
为了识别方便了,这里我把我需要的按键都做成了一个枚举,这样用起来就不1234567方便多了
enum controlKey { key_Control, key_Up, Key_Down, key_Left, key_Right };
目前呢,就是这么几个按键,后期有需求在正加按键吧。
实现切面图片资源替换的代码
void MainControl::setKeyBordPressed(controlKey key) { switch (key) { case key_Control: ui->label_ctrl->setStyleSheet("QLabel{border-image:url(:/ControlPanel/Resources/ControlPanel/Key/ctrl_o.png);}"); controlIsPressed = true; break; case key_Up: ui->label_up->setStyleSheet("QLabel{border-image:url(:/ControlPanel/Resources/ControlPanel/Key/up_o.png);}"); break; case Key_Down: ui->label_down->setStyleSheet("QLabel{border-image:url(:/ControlPanel/Resources/ControlPanel/Key/down_o.png);}"); break; case key_Left: ui->label_left->setStyleSheet("QLabel{border-image:url(:/ControlPanel/Resources/ControlPanel/Key/left_o.png);}"); break; case key_Right: ui->label_right->setStyleSheet("QLabel{border-image:url(:/ControlPanel/Resources/ControlPanel/Key/right_o.png);}"); break; default: break; } } void MainControl::setKeyBordRelease(controlKey key) { switch (key) { case key_Control: ui->label_ctrl->setStyleSheet("QLabel{border-image:url(:/ControlPanel/Resources/ControlPanel/Key/ctrl_w.png);}"); controlIsPressed = false; break; case key_Up: ui->label_up->setStyleSheet("QLabel{border-image:url(:/ControlPanel/Resources/ControlPanel/Key/up_w.png);}"); break; case Key_Down: ui->label_down->setStyleSheet("QLabel{border-image:url(:/ControlPanel/Resources/ControlPanel/Key/down_w.png);}"); break; case key_Left: ui->label_left->setStyleSheet("QLabel{border-image:url(:/ControlPanel/Resources/ControlPanel/Key/left_w.png);}"); break; case key_Right: ui->label_right->setStyleSheet("QLabel{border-image:url(:/ControlPanel/Resources/ControlPanel/Key/right_w.png);}"); break; default: break; } }