Qt5之事件学习总结
首先要明白一个概念,事件和信号并不一样,比如单击一下鼠标,就会产生鼠标事件(QMouseEvent),是对这个动作的描述,而因为按钮被按下了,按钮会发出clicked()的单击信号(是按钮控件产生的)。
1.事件处理方式:
method 1:重新实现部件的事件处理函数,如:mousePressEvent(),keyPressEvent()等等。是最常用的方法!!!
method 2:重新实现notify()函数。需要继承QApplication类,可以再事件过滤事件之前获得事件,一次只可以处理一个事件。
method 3:向QApplication的全局对象安装时间过滤器,一个程序只有一个QApplication对象,可以处理多个事件,与method 2功能相同。
method 4:重新实现event()函数。QObject的event()函数可以再默认事件处理函数之前获得该事件。
method 5:在对象上安装事件过滤器。
2.事件传递过程:
父部件的事件过滤器 -> 本部件的event()函数 -> 本部件的事件处理函数 -> 父部件的处理函数(前提是子部件忽略该事件)
父部件的代码示例(分别为.h和.cpp):
public:
bool eventFilter(QObject *obj, QEvent *event);
protected:
void keyPressEvent(QKeyEvent *event); bool Widget::eventFilter(QObject *obj, QEvent *event)
{
if(obj == lineEidt)
{
if(event->type() == QEvent::KeyPress)
qDebug() << "widget的事件过滤器";
}
return QWidget::eventFilter(obj,event);
} void Widget::keyPressEvent(QKeyEvent *event)
{
qDebug() << "widget键盘按下事件";
}
子部件的代码实例:(QLineEdit控件)
public:
bool event(QEvent *event); protected:
void keyPressEvent(QKeyEvent *event); bool MyLineEdit::event(QEvent *event)
{
if(event->type() == QEvent::KeyPress)
{
qDebug() << "MyLineEdit的event()函数";
event->ignore();
return true;
}
return QLineEdit::event(event); } void MyLineEdit::keyPressEvent(QKeyEvent *event)
{
qDebug() << "MyLineEdit键盘按下事件";
QLineEdit::keyPressEvent(event);
event->ignore();
}
运行结果如下:(如果在子部件没有忽略事件,那么父部件的事件处理函数不会被调用)
3.事件过滤器:
只是QObject 的两个函数:
installEventFilter();安装事件过滤器
eventFilter(QObject *obj, QEvent *event);实现事件处理
4.事件发送:
QApplication类的sendEvent()和postEvent();
区别:
postEvent | sendEvent |
放到等待调度队列 | 立即处理 |
必须在堆上(new)创建QEvent对象,会自动删除 | 无法自动删除,需要在栈上创建QEvent对象(系统释放) |
5.事件处理函数:
函数非常多,但这里只总结经常使用到的。
QMouseEvent,QWheelEvent
void mouseDoubleClickEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void mousePressEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
void wheelEvent(QWheelEvent *event);
QKeyEvent,QTimerEvent
void keyPressEvent(QKeyEvent *event);
void keyReleaseEvent(QKeyEvent *event);
void timerEvent(QTimerEvent *event);
Qt5之事件学习总结的更多相关文章
- Mysql事件学习
出自:http://blog.chinaunix.net/uid-20639775-id-3323098.html Mysql事件学习 在系统管理或者数据库管理中,经常要周期性的执行某一个命令或者SQ ...
- C#委托与事件学习笔记
委托事件学习笔记 本文是学习委托和事件的笔记,水平有限,如有错漏之处,还望大神不吝赐教. 什么是委托?从字面意思来解释,就是把一个动作交给别人去执行.在实际开发中最常用的就是使一个方法可以当做一个参数 ...
- C# event 事件学习
C# event 事件学习 运行环境:Window7 64bit,.NetFramework4.61,C# 6.0: 编者:乌龙哈里 2017-02-26 章节: 简单事件编写 模拟 WPF 控件传递 ...
- 《JS高程》事件学习笔记
事件:文档或浏览器窗口中发生的一些特定的交互瞬间,也即用户或浏览器自身执行的某种动作. -------------------------------------------------------- ...
- JS 点击事件学习总结
废话篇: 在我们编写无论什么网页内容的时候我们总是或多或少的要接触到点击事件这一范畴的,写过几个简短的demo和网页之后,感觉自己对电机事件一类的东西了解也更为的清楚了,之前写过很多零零散散的东西现在 ...
- android touchEvent事件学习
学习网址:http://www.apkbus.com/forum.php?mod=viewthread&tid=44296 1:Android Touch事件传递机制解析 android系统中 ...
- jQuery事件学习
1.JS事件的基本知识 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...
- Qt5鼠标事件及实例
mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include <QLa ...
- jQuery Mobile的学习时间bottonbutton的事件学习
程序猿都非常懒.你懂的! 生命的绝唱来机仅仅争朝夕,如诗的年华更需惜时如金. 不要让今天的懈怠成为一生的痛. 每天都在进步. 近期在学习jquery mobile开发.使用的button,绑定事件,和 ...
随机推荐
- VM安装kali操作系统
工具:VMware Workstation 15 Pro(15.5.6 build-16341506),kali-linux-2020.2-installer-amd64.iso vm15下载链接:h ...
- 第十八篇 -- QTreeWidget应用篇 -- kuwo
效果图: 最近学习QTreeWidget,总想着做些什么,正好学习过一点简单的爬虫,就做了一个简易的"酷我音乐下载器",界面可能不太好看,以后继续优化. ui_kuwo.py # ...
- 前端构建第1篇之---引入elementUI
张艳涛 写于2021-1-19 HOW:如何引入elementui? 在项目根目录package.json引入,在重新执行npm install "dependencies": { ...
- 适合普通大学生的 Java 后端开发学习路线
大家好,我是帅地. 接下来的一段时间,帅地会总结各种技术栈的学习路线,例如 Java 开发,C++ 开发,python 开发,前端开发等等,假如你没有明确的目标,或许可以按照我说的学习路线来学习一波, ...
- 浅谈Blazor开发的那些事
在这篇文章中,我们将解决一些常见的Blazor问题.具体来说就是"什么是Blazor",但更重要的是"为什么要用Blazor".既然我们已经有了Angular. ...
- fastboot刷机小脚本
在Windows系统下,一般刷机命令是在cmd路径下执行如下命令: 1.adb reboot bootloader2.fastboot flash boot +boot路径3.fastboot fla ...
- Android中的一些小细节
在代码中获取到的padding .margin.getWidth.event.getX.context.getResources().getDimensionPixelSize(R.dimen.key ...
- python UI自动化之鼠标事件
使用 pyautogui 模块:import pyautogui 1. 鼠标移动至:1629,875是电脑屏幕坐标:0.25是移动时间 pyautogui.moveTo(1629,875, durat ...
- UI:PointerEventData
原因:判断是否将一个UI物体拖放到另一个UI物体上面. 1.拖拽实现可以直接用EventTrigger组件或者自己实现拖拽事件的接口完成: 2.在OnDrag方法中借助PointEventData事件 ...
- IntelliJ IDEA 中为Maven 配置阿里云镜像源
idea中查看位置,应该都是一样的这个位置 在此位置下新建一个.xml文件 内容如下: <?xml version="1.0" encoding="UTF-8&qu ...