Qt 事件处理 快捷键(重写eventFilter的函数,使用Qt::ControlModifier判断)
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的函数如下:
- bool Window::eventFilter(QObject *obj, QEvent *e)
- {
- Q_ASSERT(obj == ui.inputMsgEdit);
- if (e->type() == QEvent::KeyPress)
- {
- QKeyEvent *event = static_cast(e);
- if (event->key() == Qt::Key_Return && (event->modifiers() & Qt::ControlModifier))
- {
- sendMessage();
- return true;
- }
- }
- return false;
- }
然后把这个过滤器用installEventFilter函数安装在聊天窗口的输入框上(QTextEdit),这样就实现快捷键的功能了。
三键组合Shift + Ctrl + A的实现
只要在窗体中相应keyPressEvent事件函数即可。
- void Window::keyPressEvent(QKeyEvent *e)
- {
- if (e->modifiers() == (Qt::ShiftModifier | Qt::ControlModifier) && e->key() == Qt::Key_A)
- {
- //pressed
- }
- }
键盘按住Ctrl键 + 鼠标左键的实现
在窗体中相应mousePressEvent事件函数在其中检测Ctrl键是否按住即可。
- void Window::mousePressEvent(QMouseEvent *e)
- {
- // 获取鼠标在点击窗体上的坐标
- QPoint pos = e->pos();
- if (e->button() == LeftButton)
- {
- if ( QApplication::keyboardModifiers () == Qt::ControlModifier)
- {
- //pressed
- }
- }
- }
一个例子:
- #include "mainwindow.h"
- #include <QKeyEvent>
- #include <QMessageBox>
- #include <QDebug>
- #include <QShortcut>
- #include <QPushButton>
- #include <QHBoxLayout>
- #include <QAction>
- MainWindow::MainWindow(QWidget *parent) :
- QMainWindow(parent)
- {
- // 设置窗口布局
- QWidget *mainWidget = new QWidget(this);
- QPushButton *button1 = new QPushButton("MessageBoxA", this);
- QPushButton *button2 = new QPushButton("MessageBoxB", this);
- QHBoxLayout *layout = new QHBoxLayout(this);
- layout->addWidget(button1);
- layout->addWidget(button2);
- mainWidget->setLayout(layout);
- this->setCentralWidget(mainWidget);
- this->resize(200, 100);
- this->setWindowTitle("Test");
- // 创建QAction并设置快捷键
- QAction *actionA = new QAction(this);
- actionA->setShortcut(QKeySequence(tr("Ctrl+A")));
- // actionA->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_A));
- QAction *actionB = new QAction(this);
- actionB->setShortcut(QKeySequence(tr("Ctrl+B")));
- // actionA->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_B));
- // 给button添加快捷键
- // this->addAction(actionA);// 没用
- button1->addAction(actionA);// 必须将快捷键添加到按钮上,同时使keyPressEvent失效,无法捕捉到Ctrl+A
- button2->addAction(actionB);
- // 设置快捷键相应
- connect(actionA, &QAction::triggered, this, &MainWindow::button1_click);
- connect(actionB, &QAction::triggered, this, &MainWindow::button2_click);
- // 设置按钮点击事件相应
- connect(button1, &QPushButton::clicked, this, &MainWindow::button1_click);
- connect(button2, &QPushButton::clicked, this, &MainWindow::button2_click);
- // 占用快捷键,使keyPressEvent函数失效
- QShortcut *shortCut1 = new QShortcut(QKeySequence(tr("Delete")), this);
- QShortcut *shortCut2 = new QShortcut(QKeySequence(tr("Return")), this);
- // QShortcut *shortCut2 = new QShortcut(tr("Return"), this);
- }
- MainWindow::~MainWindow()
- {
- }
- // 如果快捷键被设置,keyPressevent就无法处理相应的按钮事件
- void MainWindow::keyPressEvent(QKeyEvent *event)
- {
- switch (event->key())
- {
- case Qt::Key_0:
- {
- qDebug() << Qt::Key_0;
- QMessageBox::about(NULL, "0", "0");
- break;
- }
- case Qt::Key_Return:// 被占用,失效
- {
- qDebug() << Qt::Key_Return;
- QMessageBox::about(NULL, "return", "return");
- break;
- }
- case Qt::Key_Delete:// 被占用,失效
- {
- qDebug() << Qt::Key_Delete;
- QMessageBox::about(NULL, "Delete", "Delete");
- break;
- }
- case QKeySequence::Delete:// 捕获不到,不能有这种方式处理
- {
- qDebug() << QKeySequence::Delete;
- QMessageBox::about(NULL, "QKeySequence::Delete", "QKeySequence::Delete");
- break;
- }
- case Qt::Key_F1:
- {
- qDebug() << Qt::Key_F1;
- QMessageBox::about(NULL, "F1", "F1");
- break;
- }
- case Qt::Key_O:// 处理组合快捷按钮
- {
- if (event->modifiers() & Qt::ControlModifier)
- {
- QMessageBox::about(NULL, "Ctr+O", "Ctr+O");
- }
- break;
- }
- case Qt::Key_A:// 被窗口button占用,失效,不能处理
- {
- if (event->modifiers() & Qt::ControlModifier)
- {
- QMessageBox::about(NULL, "Ctr+A", "Ctr+A");
- }
- break;
- }
- default:
- {
- qDebug() << event->key();
- }
- }
- // if (event->key() == Qt::Key_O)
- // {
- // if (event->modifiers() & Qt::ControlModifier)
- // {
- // QMessageBox::about(NULL, "Ctr+O", "Ctr+O");
- // }
- // }
- }
- void MainWindow::keyReleaseEvent(QKeyEvent *event)
- {
- }
- void MainWindow::button1_click()
- {
- QMessageBox::about(NULL, "MessageBoxA", "MessageBoxA");
- }
- void MainWindow::button2_click()
- {
- QMessageBox::about(NULL, "MessageBoxB", "MessageBoxB");
- }
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判断)的更多相关文章
- 【转】Qt 事件处理机制 (下篇)
转自:http://mobile.51cto.com/symbian-272816.htm 在Qt中,事件被封装成一个个对象,所有的事件均继承自抽象类QEvent. 接下来依次谈谈Qt中有谁来产生.分 ...
- Qt 事件处理机制 (下篇)
继续我们上一篇文章继续介绍,Qt 事件处理机制 (上篇) 介绍了Qt框架的事件处理机制:事件的产生.分发.接受和处理,并以视窗系统鼠标点击QWidget为例,对代码进行了剖析,向大家分析了Qt框架如何 ...
- Qt 学习之路 2(19):事件的接受与忽略(当重写事件回调函数时,时刻注意是否需要通过调用父类的同名函数来确保原有实现仍能进行!有好几个例子。为什么要这么做?而不是自己去手动调用这两个函数呢?因为我们无法确认父类中的这个处理函数有没有额外的操作)
版本: 2012-09-29 2013-04-23 更新有关accept()和ignore()函数的相关内容. 2013-12-02 增加有关accept()和ignore()函数的示例. 上一章我们 ...
- QT事件过滤器(QT事件处理的5个层次:自己覆盖或过滤,父窗口过滤,Application过滤与通知)
Qt事件模型一个真正强大的特色是一个QObject 的实例能够管理另一个QObject 实例的事件. 让我们试着设想已经有了一个CustomerInfoDialog的小部件.CustomerInfoD ...
- Qt 事件处理的五个层次
看了这篇文章(见http://devbean.blog.51cto.com/448512/231861),然后经过自己的思考,把Qt事件处理的五个层次.同时也是Qt时间处理的流程画了出来.若有不对请批 ...
- QT开发(十二)——QT事件处理机制
一.QT事件简介 QT程序是事件驱动的, 程序的每个动作都是由内部某个事件所触发.QT事件的发生和处理成为程序运行的主线,存在于程序整个生命周期. 常见的QT事件类型如下: 键盘事件: 按键按下和松开 ...
- Qt事件处理机制
研一的时候开始使用Qt,感觉用Qt开发图形界面比MFC的一套框架来方便的多.后来由于项目的需要,也没有再接触Qt了.现在要重新拾起来,于是要从基础学起. Now,开始学习Qt事件处理机制. 先给出原文 ...
- 9、Qt 事件处理机制
原文地址:http://mobile.51cto.com/symbian-272812.htm 在Qt中,事件被封装成一个个对象,所有的事件均继承自抽象类QEvent. 接下来依次谈谈Qt中有谁来产生 ...
- Qt 事件处理机制
Qt 事件处理机制 因为这篇文章写得特别好,将Qt的事件处理机制能够阐述的清晰有条理,并且便于学习.于是就装载过来了(本文做了排版,并删减了一些冗余的东西,希望原主勿怪),以供学习之用. 简介 在Qt ...
随机推荐
- Tokumx vs Mongodb
Mongodb是一个文档型nosql数据库 採用C++编写 Mongo DB最大的优势在于全部的数据持久操作都无需开发者手动编写SQL语句,直接调用方法就能够轻松的实现CRUD操作. 非常多人觉得mo ...
- C++基础代码--20余种数据结构和算法的实现
C++基础代码--20余种数据结构和算法的实现 过年了,闲来无事,翻阅起以前写的代码,无意间找到了大学时写的一套C++工具集,主要是关于数据结构和算法.以及语言层面的工具类.过去好几年了,现在几乎已经 ...
- UIlabel文字大小自适应label宽度变大变小
label.adjustsFontSizeToFitWidth = YES; //默认no
- svn不支持中文路径问题的解决
作者:朱金灿 来源:http://blog.csdn.net/clever101 svn的授权文件authz默认是不支持中文路径的,因此在精确控制中文文件夹的授权时往往会出错.要解决这个问题,需要用U ...
- 【hdu2825】ac自动机 + 状压dp
传送门 题目大意: 给你一些密码片段字符串,让你求长度为n,且至少包含k个不同密码片段串的字符串的数量. 题解: 因为密码串不多,可以考虑状态压缩 设dp[i][j][sta]表示长为i的字符串匹配到 ...
- SQLite做为本地缓存的应用需要注意的地方
原文:SQLite做为本地缓存的应用需要注意的地方 今天看到了园友陆敏计的一篇文章<<C#数据本地存储方案之SQLite>>, 写到了SQLite的诸多优点,尤其适应于本地数据 ...
- URLDecoder和URLEncoder的使用总结
其实,这两个类的使用并不复杂,URLDecoder和URLEncoder它的作用主要是用于普通字符串和application/x-www-form-rulencoded MIME字符串之间的转换,一般 ...
- VC命令行编译中出现Invalid switch错误的解决办法
作者:朱金灿 来源:http://blog.csdn.net/clever101 使用makefile编译gdal库出现一个错误: cd .. if exist./gdal19_i_D.lib del ...
- wpf中xaml的类型转换器与标记扩展
原文:wpf中xaml的类型转换器与标记扩展 这篇来讲wpf控件属性的类型转换器 类型转换器 类型转换器在asp.net控件中已经有使用过了,由于wpf的界面是可以由xaml组成的,所以标签的便利也需 ...
- Win7 64有点找不到MSVCP71.DLL和MSVCR71.dll
现象: win7启动好多程序都报找不到MSVCP71.DLL,网页上不去,可是非常奇怪的是好像在线给系统打补丁没有受到不论什么影响,能正常打补丁. 解决: 从本机搜索了一下msvcp71.dll ...