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的函数如下:

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

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

三键组合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. }
  7. }

键盘按住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. }

一个例子:

  1. #include "mainwindow.h"
  2. #include <QKeyEvent>
  3. #include <QMessageBox>
  4. #include <QDebug>
  5. #include <QShortcut>
  6. #include <QPushButton>
  7. #include <QHBoxLayout>
  8. #include <QAction>
  9. MainWindow::MainWindow(QWidget *parent) :
  10. QMainWindow(parent)
  11. {
  12. // 设置窗口布局
  13. QWidget *mainWidget = new QWidget(this);
  14. QPushButton *button1 = new QPushButton("MessageBoxA", this);
  15. QPushButton *button2 = new QPushButton("MessageBoxB", this);
  16. QHBoxLayout *layout = new QHBoxLayout(this);
  17. layout->addWidget(button1);
  18. layout->addWidget(button2);
  19. mainWidget->setLayout(layout);
  20. this->setCentralWidget(mainWidget);
  21. this->resize(200, 100);
  22. this->setWindowTitle("Test");
  23. // 创建QAction并设置快捷键
  24. QAction *actionA = new QAction(this);
  25. actionA->setShortcut(QKeySequence(tr("Ctrl+A")));
  26. // actionA->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_A));
  27. QAction *actionB = new QAction(this);
  28. actionB->setShortcut(QKeySequence(tr("Ctrl+B")));
  29. // actionA->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_B));
  30. // 给button添加快捷键
  31. // this->addAction(actionA);// 没用
  32. button1->addAction(actionA);// 必须将快捷键添加到按钮上,同时使keyPressEvent失效,无法捕捉到Ctrl+A
  33. button2->addAction(actionB);
  34. // 设置快捷键相应
  35. connect(actionA, &QAction::triggered, this, &MainWindow::button1_click);
  36. connect(actionB, &QAction::triggered, this, &MainWindow::button2_click);
  37. // 设置按钮点击事件相应
  38. connect(button1, &QPushButton::clicked, this, &MainWindow::button1_click);
  39. connect(button2, &QPushButton::clicked, this, &MainWindow::button2_click);
  40. // 占用快捷键,使keyPressEvent函数失效
  41. QShortcut *shortCut1 = new QShortcut(QKeySequence(tr("Delete")), this);
  42. QShortcut *shortCut2 = new QShortcut(QKeySequence(tr("Return")), this);
  43. // QShortcut *shortCut2 = new QShortcut(tr("Return"), this);
  44. }
  45. MainWindow::~MainWindow()
  46. {
  47. }
  48. // 如果快捷键被设置,keyPressevent就无法处理相应的按钮事件
  49. void MainWindow::keyPressEvent(QKeyEvent *event)
  50. {
  51. switch (event->key())
  52. {
  53. case Qt::Key_0:
  54. {
  55. qDebug() << Qt::Key_0;
  56. QMessageBox::about(NULL, "0", "0");
  57. break;
  58. }
  59. case Qt::Key_Return:// 被占用,失效
  60. {
  61. qDebug() << Qt::Key_Return;
  62. QMessageBox::about(NULL, "return", "return");
  63. break;
  64. }
  65. case Qt::Key_Delete:// 被占用,失效
  66. {
  67. qDebug() << Qt::Key_Delete;
  68. QMessageBox::about(NULL, "Delete", "Delete");
  69. break;
  70. }
  71. case QKeySequence::Delete:// 捕获不到,不能有这种方式处理
  72. {
  73. qDebug() << QKeySequence::Delete;
  74. QMessageBox::about(NULL, "QKeySequence::Delete", "QKeySequence::Delete");
  75. break;
  76. }
  77. case Qt::Key_F1:
  78. {
  79. qDebug() << Qt::Key_F1;
  80. QMessageBox::about(NULL, "F1", "F1");
  81. break;
  82. }
  83. case Qt::Key_O:// 处理组合快捷按钮
  84. {
  85. if (event->modifiers() & Qt::ControlModifier)
  86. {
  87. QMessageBox::about(NULL, "Ctr+O", "Ctr+O");
  88. }
  89. break;
  90. }
  91. case Qt::Key_A:// 被窗口button占用,失效,不能处理
  92. {
  93. if (event->modifiers() & Qt::ControlModifier)
  94. {
  95. QMessageBox::about(NULL, "Ctr+A", "Ctr+A");
  96. }
  97. break;
  98. }
  99. default:
  100. {
  101. qDebug() << event->key();
  102. }
  103. }
  104. //    if (event->key() == Qt::Key_O)
  105. //    {
  106. //        if (event->modifiers() & Qt::ControlModifier)
  107. //        {
  108. //            QMessageBox::about(NULL, "Ctr+O", "Ctr+O");
  109. //        }
  110. //     }
  111. }
  112. void MainWindow::keyReleaseEvent(QKeyEvent *event)
  113. {
  114. }
  115. void MainWindow::button1_click()
  116. {
  117. QMessageBox::about(NULL, "MessageBoxA", "MessageBoxA");
  118. }
  119. void MainWindow::button2_click()
  120. {
  121. QMessageBox::about(NULL, "MessageBoxB", "MessageBoxB");
  122. }

http://blog.csdn.net/caoshangpa/article/details/77933937

原文链接:http://blog.csdn.net/yang382197207/article/details/45363967

原文链接:http://blog.csdn.net/xj626852095/article/details/12039093

Qt 事件处理 快捷键(重写eventFilter的函数,使用Qt::ControlModifier判断)的更多相关文章

  1. 【转】Qt 事件处理机制 (下篇)

    转自:http://mobile.51cto.com/symbian-272816.htm 在Qt中,事件被封装成一个个对象,所有的事件均继承自抽象类QEvent. 接下来依次谈谈Qt中有谁来产生.分 ...

  2. Qt 事件处理机制 (下篇)

    继续我们上一篇文章继续介绍,Qt 事件处理机制 (上篇) 介绍了Qt框架的事件处理机制:事件的产生.分发.接受和处理,并以视窗系统鼠标点击QWidget为例,对代码进行了剖析,向大家分析了Qt框架如何 ...

  3. Qt 学习之路 2(19):事件的接受与忽略(当重写事件回调函数时,时刻注意是否需要通过调用父类的同名函数来确保原有实现仍能进行!有好几个例子。为什么要这么做?而不是自己去手动调用这两个函数呢?因为我们无法确认父类中的这个处理函数有没有额外的操作)

    版本: 2012-09-29 2013-04-23 更新有关accept()和ignore()函数的相关内容. 2013-12-02 增加有关accept()和ignore()函数的示例. 上一章我们 ...

  4. QT事件过滤器(QT事件处理的5个层次:自己覆盖或过滤,父窗口过滤,Application过滤与通知)

    Qt事件模型一个真正强大的特色是一个QObject 的实例能够管理另一个QObject 实例的事件. 让我们试着设想已经有了一个CustomerInfoDialog的小部件.CustomerInfoD ...

  5. Qt 事件处理的五个层次

    看了这篇文章(见http://devbean.blog.51cto.com/448512/231861),然后经过自己的思考,把Qt事件处理的五个层次.同时也是Qt时间处理的流程画了出来.若有不对请批 ...

  6. QT开发(十二)——QT事件处理机制

    一.QT事件简介 QT程序是事件驱动的, 程序的每个动作都是由内部某个事件所触发.QT事件的发生和处理成为程序运行的主线,存在于程序整个生命周期. 常见的QT事件类型如下: 键盘事件: 按键按下和松开 ...

  7. Qt事件处理机制

    研一的时候开始使用Qt,感觉用Qt开发图形界面比MFC的一套框架来方便的多.后来由于项目的需要,也没有再接触Qt了.现在要重新拾起来,于是要从基础学起. Now,开始学习Qt事件处理机制. 先给出原文 ...

  8. 9、Qt 事件处理机制

    原文地址:http://mobile.51cto.com/symbian-272812.htm 在Qt中,事件被封装成一个个对象,所有的事件均继承自抽象类QEvent. 接下来依次谈谈Qt中有谁来产生 ...

  9. Qt 事件处理机制

    Qt 事件处理机制 因为这篇文章写得特别好,将Qt的事件处理机制能够阐述的清晰有条理,并且便于学习.于是就装载过来了(本文做了排版,并删减了一些冗余的东西,希望原主勿怪),以供学习之用. 简介 在Qt ...

随机推荐

  1. 【33.33%】【codeforces 552B】Vanya and Books

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  2. 关于 rman duplicate from active database 搭建dataguard--系列一

    关于 rman duplicate from active database.详细操作实际为backup as copy .会拷贝非常多空块.对于那些数据库数据文件超过100G的都不是非常建议用:在非 ...

  3. 【机器学习实战】第9章 树回归(Tree Regression)

    第9章 树回归 <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/ ...

  4. 设置statusBar状态栏颜色

    设置statusBar的[前景部分] 简单来说,就是设置显示电池电量.时间.网络部分标示的颜色, 这里只能设置两种颜色: 默认的黑色(UIStatusBarStyleDefault) 白色(UISta ...

  5. .net core——Docker化开发和部署

    原文:.net core--Docker化开发和部署 本篇文章是使用Vs2017生成的Dockerfile进行部署的. 目录 VS2017生成Docker部署项目 Dockerfile内容 在开发服务 ...

  6. MAC 安装下载好的.gz包(不像.dmg直接双击就行了)

    下载之后解压,然后在terminal里敲命令吧: 复制文件:蓝色部分为你解压文件的路径,直接拖到这里就行了$ sudo mv mysql-5.1.45-osx10.6-x86_64文件路径 /usr/ ...

  7. Cocos2d-x 脚本语言Lua基本语法

    Cocos2d-x 脚本语言Lua基本语法 前面一篇博客对Lua这门小巧的语言进行了简单的介绍.本篇博客来给大家略微讲一下Lua的语法.不会长篇累牍得把Lua的全部语法都讲一遍,这里通过下面几点来讲L ...

  8. Python 第三方库 cp27、cp35 等文件名的含义

    What does version name 'cp27' or 'cp35' mean in Python? 如对于 gensim-0.12.4-cp27-none-win_amd64.whl文件名 ...

  9. Cordova热更新和App升级 - 简书

    原文:Cordova热更新和App升级 - 简书 公司的cordova项目前段时间增加了热更新功能,自己第一次做的时候在网上查找了很多资料,有的资料写的并不全面遇到了很多坑.因此总结一些在开发过程中遇 ...

  10. QT5.8.0+MSVC2015安装以及环境配置(不需要安装VS2015)

    原文:QT5.8.0+MSVC2015安装以及环境配置(不需要安装VS2015) 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/snow_rain_ ...