• 17.QT-事件处理分析、事件过滤器、拖放事件


    Qt常见的事件继承图如下:

     

    • QInputEvent:用户输入事件
    • QDropEvent:用户拖放事件
    • QPaintEvent:描述操作系统绘制GUI动作的事件
    • QCloseEvent:用户关闭窗口事件
    • QTimerEvent:计时器事件

    事件处理方式顺序

    1.Qt事件产生后立即被分发到QWidget对象

    2.QWidget中的event(QEvent*)进行事件处理

    3.event()根据事件类型调用不同的事件处理函数

    4.在事件处理函数中发送Qt中预定义的信号

    5.调用信号关联的槽函数

    <span "="" src="https://images2018.cnblogs.com/blog/1182576/201805/1182576-20180505214531347-1037688900.png">

    QPushButton事件处理总结

    1.当点击按钮后,将会触发鼠标事件

    2.调用event(QEvent*)成员函数

    3.调用mouseReleaseEvent(QMouseEvent*)成员函数

    4.调用click()成员函数

    5.触发信号SIGNAL(clicked());

    同样,当用户点击窗口的关闭按钮时,也会触发closeEvent()事件函数,该函数需要重写,才能实现

    参考示例:

    类似的还有keyEvent()获取键盘事件函数, keyReleaseEvent()键盘按下事件函数,enterEvent光标进入组件事件函数, leaveEvent光标离开组件事件函数等等。

    其中QCloseEvent继承与QEvent,在QEvent中常用成员函数有

    当使用ignore()处理事件时,该事件可能会传递给其父组件对象继续处理

    步骤如下:

    • 写两个类: QMyWidget、QMyLineEdit(QMyLineEdit是QMyWidget的类成员)
    • 通过QMyLineEdit来重写LineEdit的keyReleaseEvent()键盘按下事件函数
    • 通过QMyWidget来重写QWidget的keyReleaseEvent()键盘按下事件函数
    • 然后通过ignore()处理QMyLineEdit的keyReleaseEvent()事件函数
    • 判断是否会继续执行QMyWidget父组件的keyReleaseEvent()事件函数

    QLineEdit.h如下所示:

    QLineEdit.cpp如下所示:

    QMyWidget.h如下所示:

    QMyWidget.cpp如下所示:

    main()函数如下所示:

    效果如下:

     

    可以看到成员调用了event->ignore()函数忽略事件后,同样也会继续进入QMyWidget类处理事件 

    Qt中的事件过滤器

    • 事件过滤器可以对需要的组件接收到的事件进行过滤,以及监控
    • 任意的QObject对象都可以作为事件过滤器使用雅思7分有多难
    • 事件过滤器的实现,需要重写eventFilter()函数
    • 组件要想被监控,则需要通过installEventFilter()安装事件过滤器
    • 事件过滤器能够决定是否将事件转发给组件对象,如下图所示:

    eventFilter函数体如下所示:

    参考示例-实现文本框只允许输入数字:

    常用的拖放事件相关函数有:

    拖放事件所处理的数据是QMimeData类

    • QMimeData类可以通过QDragEnterEvent 或者 QDropEvent 的成员函数QDropEvent()获取
    • QMimeData支持多种不同类型的文件数据

    MIME类型常用处理函数如下所示:

     

    拖放事件的步骤如下:

    1.在构造函数里通过setAcceptDrops(true)函数,让该组件能接受拖放事件

    2.重写dragEnterEvent(QDragEnterEvent* event)函数并判断MIME类型

      如果是期待的类型,则调用event ->acceptProposedAction();

      否则调用 : event ->ignore();

    3.重写dropEvent()函数并判断MIME类型

      如果是期待的类型,则获取MIME数据并处理.

      否则调用 : event ->ignore();

    效果:


    文章来源:https://www.cnblogs.com/lifexy/p/8996425.html

  • 相关阅读:
    C#学习之委托和事件
    ArcGIS许可启动问题
    空间插值——克里金插值
    maven 问题解决 tools以及jconsole两个jar包 无效
    JDBC代码示例
    mysql 同一IP 产生太多终端的数据库连接导致阻塞
    apache 反向代理配置
    oracle、mysql、sql server等;流行数据库的链接驱动配置
    POI XSSF与HSSF的 使用区别
    使用IDEA开发Activiti工作流
  • 原文地址:https://www.cnblogs.com/xiongjim/p/9673922.html
Copyright © 2020-2023  润新知