Qt获取组合键(转)

1、CTRL+Enter发送信息的实现
      在现在的即时聊天程序中,一般都设置有快捷键来实现一些常用的功能,类似QQ可以用CTRL+Enter来实现信息的发送。
      在QT4中,所有的事件都继承与QEvent这个类,以下是用QEvent来实现快捷键的功能。
      首先所有QT类的基类QObject有一个成员函数installEventFilter,这个函数是用来将一个事件处理器和该QObject绑定起来,所以就有了我下面的想法。
      首先在chat类定义一个eventFilter,该函数是一个虚函数,可以由子类进行更改。所以声明eventFilter如下:
 
  1. virtual bool eventFilter(QObject *obj, QEvent *e);  

 

      看了下QT文档对于这个函数的声明的解释,大概意思就是如果你要过滤某个事件就返回false,如果要使用某个事件就返回true。 我想在这个函数中加入对Enter键和Ctrl+Enter组合键的判断,具体查看QKeyEvent类的文档.
 
QKeyEvent类中有函数key和modifier,key函数返回的是发生时间的按键值,modifier返回的而是修饰键,QT所支持的修饰键如下:
  1. Constant                         Value               Description  
  2.   
  3. Qt::NoModifier                 0x00000000       No modifier key is pressed.  
  4.   
  5. Qt::ShiftModifier              0x02000000       A Shift key on the keyboard is pressed.  
  6.   
  7. Qt::ControlModifier           0x04000000       A Ctrl key on the keyboard is pressed.  
  8.   
  9. Qt::AltModifier                0x08000000       An Alt key on the keyboard is pressed.  
  10.   
  11. Qt::MetaModifier             0x10000000       A Meta key on the keyboard is pressed.  
  12.   
  13. Qt::KeypadModifier          0x20000000       A keypad button is pressed.  
  14.   
  15. Qt::GroupSwitchModifier   0x40000000       X11 only. A Mode_switch key on the keyboard is pressed.  

 

 

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

重写eventFilter的函数如下:

 

  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.     }  

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

 

 

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

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

 

 

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

 

 

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

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

 

 

  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. }  

 


文档信息

 

转自:http://blog.163.com/qimo601@126/blog/static/15822093201301031640873/?suggestedreading&wumii

转载于:https://www.cnblogs.com/veins/p/3185388.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值