您的位置:首页 > 产品设计 > UI/UE

从keyPressEvent按键事件中获取QKeySequence

2016-03-16 14:30 399 查看
转自:http://www.tuicool.com/articles/UnAVbyj

【提前话】:这几天开始着手QT方面的学习了,国庆后差不多就要转战新平台了,公司的所有产品也将由Net转到QT了,对自己来说失去了一些,也得到了一些。

QKeySequence多用于快捷键,获取QKeySequence可以同按键事件的QKeyEvent获取,例如:

class Mywidget : public QWidget
{
Q_OBJECT
public:
explicit Mywidget(QWidget *parent = 0);
//省略无关代码
public:
void keyPressEvent(QKeyEvent *keyevent);
};
/*
* Mywidget::keyPressEvent 按下键盘事件
*
* created 2013.09.12 ,andy
*
*/
void Mywidget::keyPressEvent(QKeyEvent *keyevent)
{
int uKey = keyevent->key();
Qt::Key key = static_cast<Qt::Key>(uKey);
if(key == Qt::Key_unknown)
{
//nothing {unknown key}
}

if(key == Qt::Key_Control || key == Qt::Key_Shift || key == Qt::Key_Alt )
{
return ;
}

//获取修饰键(Ctrl,Alt,Shift)的状态
Qt::KeyboardModifiers modifiers = keyevent->modifiers();
//判断某个修饰键是否被按下
if(modifiers & Qt::ShiftModifier)
uKey += Qt::SHIFT;
if(modifiers & Qt::ControlModifier)
uKey += Qt::CTRL;
if(modifiers & Qt::AltModifier)
uKey += Qt::ALT;

//popup information
QMessageBox::information(this,"msg", QKeySequence(uKey).toString(QKeySequence::NativeText) ,QMessageBox::Ok);
}
【PPS】 :
如果在你的widget中已经设置了某个快捷键的话,例如Ctrl+E , 那么当你按下相应的快捷键组合(Ctrl+E)时候,我们会发现在KeyPressEvent中无法获取到该快捷键的QKeySequence,针对这种问题,很多人想到的处理方法就是添加EventFilte(事件过滤)来处理,其实最好的方法就是直接拦截QApplication::notify,因为事件的派发最后都是有QApplication::notify来派发到指定的对象的,所以notify是所有事件的”第一道门岗“,如果要对事件做一些全局过滤处理,那么QApplication::notify无疑是你最好的选择了(不推荐给QApplication安装eventfilte,除非用于调试目的),当然如果希望局部过滤或者一个对象监听另一个对象的事件,那么evntFilte(事件过滤器)是你最佳的选择了.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: