Qt 鼠标事件,键盘事件
2016-11-23 20:33
1266 查看
来源
Qt中部分控件没有鼠标信号,比如Frame中没有clicked信号,需要充从事件过滤器中获取鼠标事件,在进行处理。关于如何处理事件过滤器见博文http://blog.csdn.net/jh1513/article/details/53311084这里主要处理鼠标事件
方法
一从事件过滤器中捕获鼠标时间,事件过滤器两个函数分别是installEventFilter()和eventFilter(QObject *obj, QEvent *ev),第二个函数可以获得鼠标事件对应的对象和事件类型。再在事件过滤器函数中处理该鼠标事件,但是该方法中捕获的鼠标事件时,我对鼠标左键的信号没法响应,左键右键都是响应右键。
二
直接使用QMouseEvent中的事件,Qt帮助文档中有介绍,但是该方法似乎不能捕获到鼠标所在的对象?
第一步:只需在相应的.h文件中添加mousePressEvent事件(此函数名不能改为其他的名称,因为当鼠标移动时,系统就会去寻找名为mouseMoveEvent的函数执行。)
第二步:只需在对于的.cpp文件中实现该函。
鼠标事件
#include<QMouseEvent> void mousePressEvent(QMouseEvent *event); //单击 void mouseReleaseEvent(QMouseEvent *event); //释放 void mouseDoubleClickEvent(QMouseEvent *event); //双击 void mouseMoveEvent(QMouseEvent *event); //移动 void wheelEvent(QWheelEvent *event); //滑轮
键盘事件
#include <QKeyEvent> void keyPressEvent(QKeyEvent *event); void keyReleaseEvent(QKeyEvent *event);
示例
一事件过滤器方式,由于我这边该方法中不能区分鼠标左键右键,所以当获得鼠标事件是在我关心的控件上发生的时候,将事件由QEvent转换成QMouseEvent,判断是左键还是右键。可能是我这边电脑或程序的问题
bool MainWindow::eventFilter(QObject *obj, QEvent *ev) { if(obj == ui->frame){ if(ev->type() == QEvent::MouseButtonDblClick ){ //判断鼠标双击事件 return true; //该事件已处理 } **//在QEvent中,我判断鼠标是左键还是右键时遇到问题,故将QEvent转换成QMouseEvent来判断** *QMouseEvent *event = (QMouseEvent*)ev;* if(event->button() == Qt::LeftButton){ //鼠标左键相应 qDebug()<<"++++ 000 ++++"; return true; //该事件已经被处理 } if(event->button() == Qt::RightButton){ //鼠标右键相应 qDebug()<<"++++ 111 ++++"; return true; //该事件已经被处理 } } return true; }
二
在类.h中
protected: void MainWindow::mousePressEvent(QMouseEvent *event);
.cpp中
void MainWindow::mousePressEvent(QMouseEvent *event) { //这里给出两种区分左键信号的方法 //[1] if(event->button() == Qt::LeftButton){ qDebug()<<"++++ 123 ++++"; } //[1] //[2] if(qApp->mouseButtons() == Qt::LeftButton){ qDebug()<<"++++ 456 ++++"; } //[2] if(event->button() == Qt::RightButton){ qDebug()<<"++++ 789 ++++"; } }
附键盘事件
Qt 程序需要在main()函数创建一个QCoreApplication对象,然后调用它的exec()函数。这个函数就是开始 Qt 的事件循环。在执行exec()函数之后,程序将进入事件循环来监听应用程序的事件。当事件发生时,Qt 将创建一个事件对象。Qt 中所有事件类都继承于QEvent。在事件对象创建完毕后,Qt 将这个事件对象传递给QObject的event()函数。event()函数并不直接处理事件,而是将这些事件对象按照它们不同的类型,分发给不同的事件处理器(event handler)。如上所述,event()函数主要用于事件的分发。所以,如果你希望在事件分发之前做一些操作,就可以重写这个event()函数了
键盘事件
在头文件中添加键盘事件处理函数,在源文件中实现想相应代码
#include <QKeyEvent> void keyPressEvent(QKeyEvent *event); void keyReleaseEvent(QKeyEvent *event);
// 键盘按下事件 void Widget::keyPressEvent(QKeyEvent *event) { // 是否按下Ctrl键 特殊按键 if(event->modifiers() == Qt::ControlModifier){ // 是否按下M键 普通按键 类似 if(event->key() == Qt::Key_M){ //你的处理操作 } } else QWidget::keyPressEvent(event); //保存默认事件 //如果是处理两个普通按键,得避免自动重复,释放中也要处理 if(event->key() == Qt::Key_Up){ // 按键重复时不做处理 if(event->isAutoRepeat()) return; // 标记向上方向键已经按下 keyUp = true; }else if(event->key() == Qt::Key_Left){ if(event->isAutoRepeat()) return; keyLeft = true; } } // 按键释放事件 void Widget::keyReleaseEvent(QKeyEvent *event) { //如果是处理两个普通按键,得避免自动重复 if(event->key() == Qt::Key_Up){ if(event->isAutoRepeat()){ //你的处理操作 return; } }else if(event->key() == Qt::Key_Left){ if(event->isAutoRepeat()){ //你的处理操作 return; } } }
链接
Qt事件过滤器http://blog.csdn.net/jh1513/article/details/53311084
参考
http://blog.csdn.net/lovebird_27/article/details/50351336
http://blog.csdn.net/subkiller/article/details/8302941
相关文章推荐
- QT事件处理,鼠标事件,按键键盘事件,定时器,进度条。
- Qt学习之路——— Qt键盘、鼠标事件的处理
- Qt如何向系统发送键盘和鼠标事件?
- 嵌入式 QT code :-10737418以及自定义鼠标和键盘事件和图片问题
- 【转】Qt鼠标键盘事件
- QT中监控全局键盘鼠标事件
- QT基础(二)----鼠标、键盘事件处理机制、信息拦截机制
- Qt532,鼠标键盘事件_ZC
- QT:如何获取鼠标坐标点和键盘响应事件
- Qt鼠标键盘事件
- QT笔记之对鼠标移动和键盘按下事件作出反应
- 转《QT中监控全局键盘鼠标事件》
- Qt 学习(8)Qt Creator中鼠标键盘事件的处理实现自定义鼠标指针(转)
- 自学QT之QML实现响应鼠标和键盘事件
- QT——绘图事件、鼠标事件、QPainter、键盘事件、光标样式、登录框密码回显模式、移除字符串前后的空白、对话框accept()
- QT 实时显示鼠标所指的坐标 && 监测键盘事件
- 自学QT之QML实现响应鼠标和键盘事件
- Qt for Mac模拟鼠标以及键盘事件
- qt鼠标 键盘事件
- Qt5.5 SDL2.0 鼠标事件,键盘事件,BMP图片加载