zoukankan      html  css  js  c++  java
  • Qt获取组合键

    CTRL+Enter发送信息的实现

          在现在的即时聊天程序中,一般都设置有快捷键来实现一些常用的功能,类似QQ可以用CTRL+Enter来实现信息的发送。

          在QT4中,所有的事件都继承与QEvent这个类,以下是用QEvent来实现快捷键的功能。

          首先所有QT类的基类QObject有一个成员函数installEventFilter,这个函数是用来将一个事件处理器和该QObject绑定起来,所以就有了我下面的想法。

          首先在chat类定义一个eventFilter,该函数是一个虚函数,可以由子类进行更改。所以声明eventFilter如下:

    virtual bool eventFilter(QObject *obj, QEvent *e);

          看了下QT文档对于这个函数的声明的解释,大概意思就是如果你要过滤某个事件就返回false,如果要使用某个事件就返回true。

          我想在这个函数中加入对Enter键和Ctrl+Enter组合键的判断,具体查看QKeyEvent类的文档

          QKeyEvent类中有函数key和modifier,key函数返回的是发生时间的按键值,modifier返回的而是修饰键,QT所支持的修饰键如下:

    Constant                         Value               Description

    Qt::NoModifier                 0x00000000       No modifier key is pressed.

    Qt::ShiftModifier              0x02000000       A Shift key on the keyboard is pressed.

    Qt::ControlModifier           0x04000000       A Ctrl key on the keyboard is pressed.

    Qt::AltModifier                0x08000000       An Alt key on the keyboard is pressed.

    Qt::MetaModifier             0x10000000       A Meta key on the keyboard is pressed.

    Qt::KeypadModifier          0x20000000       A keypad button is pressed.

    Qt::GroupSwitchModifier   0x40000000       X11 only. A Mode_switch key on the keyboard is pressed.

          所以可以重写eventFilter函数来实现快捷键的功能,可以根据QKeyEvent的key和modifire来分别是Enter还是Ctrl+enter被按下。

          重写eventFilter的函数如下:

    Cpp代码  收藏代码
    1. bool Window::eventFilter(QObject *obj, QEvent *e)  
    2. {  
    3.     Q_ASSERT(obj == ui.inputMsgEdit);  
    4.    
    5.     if (e->type() == QEvent::KeyPress)  
    6.     {  
    7.         QKeyEvent *event = static_cast<QKeyEvent*>(e);  
    8.         if (event->key() == Qt::Key_Return && (event->modifiers() & Qt::ControlModifier))  
    9.         {  
    10.             sendMessage();  
    11.             return true;  
    12.         }  
    13.     }  
    14.     return false;  
    15. }  

     然后把这个过滤器用installEventFilter函数安装在聊天窗口的输入框上(QTextEdit),这样就实现快捷键的功能了。

    三键组合Shift + Ctrl + A的实现

          只要在窗体中相应keyPressEvent事件函数即可。

    Cpp代码  收藏代码
    1. void Window::keyPressEvent(QKeyEvent *e)  
    2. {  
    3.     if (e->modifiers() == (Qt::ShiftModifier | Qt::ControlModifier) && e->key() == Qt::Key_A)  
    4.     {  
    5.         //pressed  
    6.     }  
    7. }  

     键盘按住Ctrl键 + 鼠标左键的实现

          在窗体中相应mousePressEvent事件函数在其中检测Ctrl键是否按住即可。

    Cpp代码  收藏代码
    1. void Window::mousePressEvent(QMouseEvent *e)  
    2. {  
    3.     // 获取鼠标在点击窗体上的坐标  
    4.     QPoint pos = e->pos();  
    5.     if (e->button() == LeftButton)  
    6.     {  
    7.         if ( QApplication::keyboardModifiers () == Qt::ControlModifier)  
    8.         {  
    9.             //pressed  
    10.         }  
    11.     }  
    12. }  
     
  • 相关阅读:
    UML和序列图
    MVC超链接
    《Flink SQL任务自动生成与提交》后续:修改flink源码实现kafka connector BatchMode
    分布式条件下Integer大小比值的问题
    distribute by在spark中的一些应用
    桌面秀
    结构体sizeof的问题
    Android开发:View中调用自定义dialog出现的异常
    获取Android的源码
    【原创】VS2010中水晶报表与VS2008水晶报表版本冲突问题
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/3758060.html
Copyright © 2011-2022 走看看