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. }  
     
  • 相关阅读:
    228. Summary Ranges
    227. Basic Calculator II
    224. Basic Calculator
    222. Count Complete Tree Nodes
    223. Rectangle Area
    221. Maximal Square
    220. Contains Duplicate III
    219. Contains Duplicate II
    217. Contains Duplicate
    Java编程思想 4th 第4章 控制执行流程
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/3758060.html
Copyright © 2011-2022 走看看