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

最新文章

  1. ASP.NET MVC 防止 CSRF 的方法
  2. cf201.div1 Number Transformation II 【贪心】
  3. linux中安装eclipse,安装好之后不能直接建servlet,不能直接在jsp页面中run on server.权限在作怪,我猜的,
  4. 51nod比赛
  5. 如何修改mysql用户名和密码
  6. matplotlib 中文问题
  7. rm排除指定文件或指定文件夹下文件
  8. vxworks获取系统时间编程
  9. 【HDOJ】4541 Ten Googol
  10. SIEM
  11. Eclipse 乱码解决方案(UTF8 -- GBK)
  12. CentOS 7 下安装 LEMP 服务(nginx、MariaDB/MySQL 和 php)
  13. Android Device Chooser中显示Target unknown解决方法
  14. Hibernate配置详细解释
  15. Intent的Component,Action和Category属性详解-android学习之旅(五十)
  16. C#之委托和事件
  17. 小程序 &lt;web-view&gt;&lt;/web-view&gt; 中使用 form 表单提交
  18. Docker日志管理--docker部署安装ELK (十一)--技术流ken
  19. 第八次作业:聚类--K均值算法:自主实现与sklearn.cluster.KMeans调用
  20. 唯一约束(UNIQUE_KEY)

热门文章

  1. JBoss AS 7之初步了解(The Return Of The King)
  2. android jni与java之间数据传输时怎么转换
  3. 温故而知新-String类
  4. 微信公众号开发之怎样将本机IP映射成外网域名
  5. 使用CentOS7卸载自带jdk安装自己的JDK1.8
  6. SpringMVC“Ambiguous mapping found. Cannot map &#39;XXXController&#39; bean method”解决方法
  7. Shell脚本实现在Linux系统中自动安装JDK
  8. maven hadoop 3.x HADOOP_HOME and hadoop.home.dir are unset Not implemented by the WebHdfsFileSystem FileSystem implementation
  9. 采用API将AR应收账款未知未核销状态变成黄金
  10. ThoughtWorks、Teambition、Trello、Slack、DevCloud 主流敏捷软件开发工具平台比较