QEvent(事件)

事件:是对各种应用程序需要知道的由应用程序内部或外部产生的事件或动作的统称。在Qt中任何一个QObject子类实例都可以接收和处理事件。

Qt中事件作为一个对象,继承自QEvent类,常见的有以下几种:

  • QKeyEvent 键盘事件
  • QMouseEvent 鼠标事件
  • *QTimerEvent 定时器事件

QEvent(事件)

QEvent常用的函数:

accept()设置事件对象的接受标志 ==setAccept(true)ignore()

清除事件对象的接受标志参数 ==setAccept(false)

清除 accept 参数表示事件接收器不需要该事件。不需要的事件可能会传播到父小组件。

type()返回事件的类型

信号和事件的区别:

  • 事件由具体的QWidget(子)对象进行处理,信号由具体的QWidget(子)对象进行生成
  • 改写事件处理函数可能会导致程序行为发生变化,信号是否存在对应的槽函数不会改变程序的行为
  • 通常情况下,信号在具体的事件处理函数中

事件的处理:

一个事件是由一个特定的QEvent子类来表示的,但一个事件又可以包含多个事件类型。

处理事件的方法:

  • 重新实现部件的paintEvent(),mousePressEvent()等事件处理函数(最常用)
  • 重新实现notify()函数(一次只能处理一个事件)
  • 在QApplication对象上安装事件过滤器(可以同时处理多个事件)
  • 重新实现event()函数
  • 在对象上安装事件过滤器,使用事件过滤器可以在一个界面类中同时处理不同子部件的不同事件

常用的方法为第一个和第五个。

事件的传递:

事件先传递给获得焦点的窗口部件,如果该部件忽略掉该事件,那么这个事件会传递给这个部件的父部件。重新实现事件处理函数时,一般要调用父类的相应事件处理函数来实现默认操作。

例子:

创建一个项目,继承于QWidget

QEvent(事件)

添加一个c++文件,继承于QWidget

QEvent(事件)

修改mylineedit的继承关系,改为继承QLineEdit

在mylineedit.h中

QEvent(事件)

改为:

QEvent(事件)

mylineedit.cpp文件中

QEvent(事件)

改为

QEvent(事件)

这样的话就把继承关系修改为QLineEdit。

添加事件:

在mylineedit.h添加一个按键按下的事件

void keyPressEvent(QEvent *event);//按键按下事件

在mylineedit.cpp中实现

void mylineEdit::keyPressEvent(QKeyEvent * event)//鼠标按下事件
{
    qDebug()<<"mylineedit的事件触发" }< code></"mylineedit的事件触发">

在widget中创建一个mylineedit对象

在widget.h中添加头文件、一个对象和键盘事件

#include<mylineedit.h>

mylineEdit *line;//&#x4E00;&#x4E2A;&#x5BF9;&#x8C61;
void keyPressEvent(QKeyEvent * event)//&#x9F20;&#x6807;&#x6309;&#x4E0B;&#x4E8B;&#x4EF6;
</mylineedit.h>

widget.cpp的构造函数

    resize(800,800);
    line=new mylineEdit(this);
    line->move(100,100);

事件的实现:

void Widget::keyPressEvent(QKeyEvent * event)//&#x9F20;&#x6807;&#x6309;&#x4E0B;&#x4E8B;&#x4EF6;
{
    qDebug()<<"widget的事件触发" }< code></"widget的事件触发">

运行结果为

QEvent(事件)

当焦点在line中时按下回车,只会触发myline的事件,并不会传递。

QEvent(事件)

实现事件的传递:

修改mylineedit的事件

void mylineEdit::keyPressEvent(QKeyEvent * event)//&#x9F20;&#x6807;&#x6309;&#x4E0B;&#x4E8B;&#x4EF6;
{
    qDebug()<<"myline的事件触发"; qlineedit::keypressevent(event); 执行qlineedit的默认事件处理 event->ignore();//&#x5FFD;&#x7565;&#x8BE5;&#x4E8B;&#x4EF6;
}</"myline的事件触发";>
  • QLineEdit::keyPressEvent(event); //执行该市件原有的处理
  • event->ignore();//忽略该事件,忽略后可以传给父类事件

执行结果 :

QEvent(事件)

QEvent(事件)

Original: https://blog.csdn.net/qq_45303986/article/details/127815981
Author: 旷工锁
Title: QEvent(事件)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/654955/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球