从keyPressEvent按键事件中获取QKeySequence

转自: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(事件过滤器)是你最佳的选择了.

猜你喜欢

转载自blog.csdn.net/sunflover454/article/details/50904815
今日推荐