[Qt]如何屏蔽QPushButton的键盘事件

今天想实现一种效果:当界面上的QPushButton获得焦点后,点击键盘的上、下、左、右方向键,则QPushButton随之前后左右移动。
很简单的一种效果,但是实现起来却绕了弯路。
最初的想法就是在界面类中重载keyPressEvent(),当键值为方向键时对QPushButton对象进行相应的移动操作,非常简单。编译运行,选中QPushButton控件,点击键盘的左右方向键,控件并没有发生预期的移动,而是焦点转移到相邻的可tab控件上了。
Why?原来此时母窗体并没有收到键盘事件,当然也就不会处理键盘事件。键盘事件到哪去了呢?必然是QPushButton自身拦截了键盘事件,实现了焦点切换的操作,然后就丢弃了,弃了,了。。。
怎么办?天无绝人之路,为了规避这种情况,需要屏蔽QPushButton自身特有的keyPressEvent()事件处理逻辑。因此由QPushButton派生出新类UserButton,重载keyPressEvent()和keyReleaseEvent():

void UserButton::keyPressEvent(QKeyEvent* event)
{
    QWidget::keyPressEvent(event);
}
void UserButton::keyReleaseEvent(QKeyEvent* event)
{
    QWidget::keyPressEvent(event);
}

QPushButton本身也是派生自QWidget的一种类,QWidget中的按键事件只要没有处理,都会继续向其母窗体传递,直到被某一层窗体处理为止。直接调用QWidget的按键处理事件就能屏蔽QPushButton自身的按键处理逻辑,达到目的。是不是很简单?
另外,只有获得焦点的控件才能接收按键事件,因此,如果要处理按键事件,必须先确定目标窗体得到了焦点,否则也达不到目的。窗体获得焦点的方法:

QWidget *widget = new QWidget();
widget->show();
widget->setFocus();

你可能感兴趣的:(Qt编程学习与实践)