基于Qt的汽车仪表模拟
今天在编写代码的时候,发现重载键盘事件的时候无法获取到上下左右键盘案件的消息,百度后才知道是因为我窗口上面有很多控件,获取了键盘的事件。
我的做法就是让这些按控件都不要焦点
setFocusPolicy(Qt::NoFocus)
这样实现的方式其实不适合大的项目和多人协作的项目,目前还没有找到好的方式,来看下目前的效果吧。目前只有获取了ctrl 和方向键,后期根据需要在增加其他的按键解析。
看下代码吧
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;
}
}
2019/08/20 13:07