分类: C/C++
2017-03-17 14:34:10
我用QT设计师做了这个部件(下面称它为PC),其实就是三个按钮,我在一个widget中添加了多个PC并按照一定的规则排列,我希望达到的目的:
1. 初始状态下login和manage两个按钮是隐藏的;
2. 当鼠标移动到大按钮上时,login和managel两个按钮显示并可以进行点击操作,当鼠标离开大按钮是隐藏这两个按钮;
3. 用tab键在多个PC间切换,不管焦点在哪个按钮上,只要按下Tab键就立刻切换到下个PC的大按钮上;
4. 用四个方向键在所有PC的所有按钮键之间切换。
5. 当焦点在大按钮上时,按下Enter键显示login和manage按钮,或者按下down和right方向键显示两个按钮。
看起来应该很容易实现,但是实际用代码实现时遇到了一些问题。
首先目的2:
鼠标进入大按钮后会触发事件,QEvent::Enter,捕捉到该事件后直接调用函数显示login和manage,但是如果你想要对这两个按钮进行点击操作就要稍微麻烦一点,首先声明有很多方法实现这个功能。
因为要对2个小按钮操作就必须要离开大按钮,但是这就会触发鼠标离开事件QEvent::Leave,小按钮隐藏了,也就无法对其操作了。
我用了一个很简单的办法,就是鼠标离开的时候,判断鼠标是从哪里离开的,如果是下面离开,那么就先不要隐藏2个小按钮,同理如果从login按钮的右方或者上方离开时不要隐藏,如果从manage的左方或者上方离开时不要隐藏,但是这个方法有个很尴尬的问题——如果从三个按钮的缝隙间离开也不会隐藏,确实很尴尬,希望大家给出更好的办法^_^
接着目标3、4、5
其实QT的容器部件中有默认按钮事件处理方式,如果不搞这个“隐藏”活动,完全没必要做下面的事情:
大按钮只需要重新处理一下Enter、Tab键和down、right方向键,QT中Enter键对应事件Qt::Key_Return,QT中有如下定义
Key_Return=0x01000004,
Key_Enter=0x01000005,
但是Key_Enter没反应,真是搞笑。
给一下代码
elseif(event->type()==QEvent::KeyPress)
{
QKeyEvent*keyPEvent1=static_cast<QKeyEvent*>(event);
if(keyPEvent1->key()==Qt::Key_Return)
{
showButton();
focusNextChild();
}elseif(keyPEvent1->key()==Qt::Key_Tab)
{
hideButton();
focusNextChild();
}elseif(keyPEvent1->key()==Qt::Key_Right)
{
showButton();
focusNextChild();
}elseif(keyPEvent1->key()==Qt::Key_Down)
{
showButton();
focusNextChild();
}
}
接下来是login按钮的处理
elseif(event->type()==QEvent::KeyPress)
{
QKeyEvent*keyPEvent3=static_cast<QKeyEvent*>(event);
if(keyPEvent3->key()==Qt::Key_Tab)
{
hideButton();
focusPreviousChild();
focusNextChild();
}elseif(keyPEvent3->key()==Qt::Key_Right)
{
hideButton();
focusPreviousChild();
focusNextChild();
}elseif(keyPEvent3->key()==Qt::Key_Down)
{
hideButton();
focusPreviousChild();
focusNextChild();
}
}
说明:login函数的tab键处理中,在hideButton()函数执行后,如果什么都不加,焦点会跳2下,所以加了focusPreviousChild(),这里我没有太深入了解,自己猜测了几个可能,希望高手指点。