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. [CSS] Build Responsive CSS Layouts with Tachyons

    Building responsive css layouts is critical in any modern website. Tachyons makes this easy by desig ...

  2. php标准库中的优先队列SplPriorityQueue怎么使用?(继承)

    php标准库中的优先队列SplPriorityQueue怎么使用?(继承) 一.总结 1.new对象,然后通过insert方法和extract方法来使用,top方法也很常用. 2.类的话首先想到继承, ...

  3. 工具类与工具函数 —— NextPrime

    求大于某数的下一个素数: static int NextPrime (int N) { if (N % 2 == 0) ++N; int i; for (; ; N += 2){ for (i = 3 ...

  4. 【hdu 2594】Simpsons’ Hidden Talents

    Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...

  5. 【codeforces 546D】Soldier and Number Game

    time limit per test3 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  6. android 连接USB按power键锁屏2声锁屏音

    alps\frameworks\base\packages\Keyguard\src\com\android\keyguard\KeyguardViewMediator.java #1384 行左右: ...

  7. ssh 自动登录脚本

    ssh 一般要输入密码,自动设置的方法有两个: 1.通过expect来建立 #!/usr/bin/expect -f # expect在哪个目录下用whereis找下,不同的系统expect安装路径不 ...

  8. 【t073】&&【t015】魔法物品

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 有两种类型的物品:普通物品和魔法物品.每种普通物品有一个价值P,但每种魔法物品有两种价值:鉴定前的价值 ...

  9. 【BZOJ 1021】[SHOI2008]Debt 循环的债务

    [题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1021 [题意] [题解] 设f[i][j][k]表示前i种面值的钱币; 第一个人当前的 ...

  10. api的管理工具

    一.常用的api管理工具和测试的方法 1.postman 2.Yapi 3.swagger 4.Rap(阿里)