qt-C++笔记之打印所有发生的事件

这篇具有很好参考价值的文章主要介绍了qt-C++笔记之打印所有发生的事件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

qt-C++笔记之打印所有发生的事件

code review!

1.ChatGPT问答

在Qt C++中,若要打印所有发生的事件,您可以通过重写QObjectevent函数或者QApplicationnotify函数来实现。这两个方法都可以截获事件循环中的事件,但是通常更推荐使用notify方法,因为它可以捕获到传递给任何对象的所有事件。

使用 QApplication 的 notify 方法

为了打印所有事件,您可以继承QApplication类并重写其notify方法。下面是一个简单的例子:

#include <QApplication>
#include <QDebug>
#include <QEvent>

class MyApplication : public QApplication {
public:
    MyApplication(int &argc, char **argv)
        : QApplication(argc, argv) {}

    bool notify(QObject *receiver, QEvent *event) override {
        // 打印事件类型和接收对象的名称
        qDebug() << "Event Type:" << event->type() << "Receiver:" << receiver->objectName();
        // 调用基类的 notify 方法继续正常的事件传递
        return QApplication::notify(receiver, event);
    }
};

int main(int argc, char *argv[]) {
    MyApplication app(argc, argv);

    // ... 创建窗口和其他组件 ...

    return app.exec();
}

在这个重写的notify方法中,您可以看到事件类型和接收事件的对象名称。您需要记得调用基类的notify方法以确保事件继续被正常处理。

使用 QObject 的 event 方法

如果您只想监控某个特定对象的事件,您可以重写该对象的event方法:

#include <QObject>
#include <QDebug>
#include <QEvent>

class MyObject : public QObject {
public:
    MyObject(QObject *parent = nullptr) : QObject(parent) {}

protected:
    bool event(QEvent *event) override {
        // 打印事件类型
        qDebug() << "Event Type:" << event->type();
        // 调用基类的 event 方法继续正常的事件处理
        return QObject::event(event);
    }
};

// 使用 MyObject 的实例

这种方法只会打印传递给MyObject实例的事件。

在打印事件时,记得event->type()返回的是QEvent::Type枚举值,您可能需要转换这个值为人类可读的形式,可以通过创建一个映射表或者在调试时查找对应的枚举名称。

请注意,打印所有事件可能会导致大量的输出,这可能会影响应用程序的性能,因此这通常只在调试时使用。在生产环境中,您应该禁用或删除这些调试输出。

2.使用 QObject 的 event 方法

qt-C++笔记之打印所有发生的事件,qt-C++程序笔记,qt,c++,笔记

#include <QCoreApplication>
#include <QDebug>
#include <QEvent>
#include <QObject>
#include <QTimerEvent>

class MyObject : public QObject {
public:
    MyObject(QObject *parent = nullptr) : QObject(parent) {}

protected:
    bool event(QEvent *event) override {
        // 打印事件类型和对象名称
        qDebug() << "Event Type:" << event->type() << "Object:" << this->objectName();
        // 调用基类的 event 方法继续正常的事件处理
        return QObject::event(event);
    }

    void timerEvent(QTimerEvent *event) override {
        // 重写 timerEvent 来处理计时器事件
        qDebug() << "Timer Event:" << event->timerId();
        // 调用基类的 timerEvent 方法
        QObject::timerEvent(event);
    }
};

int main(int argc, char *argv[]) {
    QCoreApplication app(argc, argv);

    // 创建 MyObject 实例
    MyObject obj;
    obj.setObjectName("MyObject"); // 设置对象名称以便在调试输出中识别

    // 开始一个计时器
    int timerId = obj.startTimer(1000); // 1000毫秒

    // 进入事件循环
    return app.exec();
}

3.使用 QApplication 的 notify 方法

qt-C++笔记之打印所有发生的事件,qt-C++程序笔记,qt,c++,笔记文章来源地址https://www.toymoban.com/news/detail-828128.html

#include <QApplication>
#include <QDebug>
#include <QEvent>
#include <QWidget>

class MyApplication : public QApplication {
public:
    MyApplication(int &argc, char **argv)
        : QApplication(argc, argv) {}

    bool notify(QObject *receiver, QEvent *event) override {
        // 打印事件类型和接收者的名称
        qDebug() << "Event Type:" << event->type()
                 << "Receiver:" << (receiver ? receiver->objectName() : "NULL");
        // 调用基类的 notify 方法以继续正常的事件分发
        return QApplication::notify(receiver, event);
    }
};

int main(int argc, char *argv[]) {
    MyApplication app(argc, argv);

    QWidget window;
    window.setObjectName("MainWindow"); // 为了在调试输出中识别,设置窗口的对象名称
    window.setWindowTitle("Event Printer Example"); // 设置窗口标题
    window.show(); // 显示窗口

    return app.exec(); // 进入事件循环
}

到了这里,关于qt-C++笔记之打印所有发生的事件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • qt-c++多窗口编程

    QMessageBox继承自QDialog,显示一个模态对话框。用于用户前台信息通知或询问用户问题,并且接收问题答案。 QDialog再Qt源码中,派生类往往都是一些在特定场合下使用的预设好的对话框窗口。这些窗口无需创建对象,直接使用静态成员函数弹窗,使用静态成员函数的返回值作为

    2024年01月24日
    浏览(45)
  • Dalsa线扫相机-二次开发-QT-C++ 可用Demo(一)

           Dalsa线扫描相机的二次开发,因为官方只有MFC和命令行版本的,我需要使用QT进行开发,于是自己花时间研究,然后写了一个,效果如下:         可能GIF动图有点模糊,在图片中,上面为实时画面,我使用的是4096*128分辨率,然后使用手机的闪光灯在相机旁边摇晃

    2024年02月05日
    浏览(119)
  • 【逆向】导出表:1.编写程序打印所有的导出表信息 2.编写GetFunctionAddrByName 3.编写GetFunctionAddrByOrdinal

    这是从数据目录中获取每个表的地址  打印所有导出表的信息:   通过函数名称获取函数在DLL的偏移: 通过函数的序号获取函数在DLL的偏移 完整的代码如下,可以直接改DLL名字完美运行: 注意注意:有个踩过的坑我想分享给大家。 就是我本来想这样搞: 申请一个堆,里面

    2024年02月07日
    浏览(39)
  • QT-C++ 注册机软件,生成机器码和注册码,支持授权时间

    1、编译环境: 本程序使用的编译环境是QT5.12.0和VS2017,如果你安装环境不用,你可以通过阅读里面的程序代码,进行代码有效的提取,然后你再自己创建工程进行编译使用。 2、基本描述: 通过获取计算机的硬件信息,然后通过加密组成,生成每个计算机的唯一机器码,类似

    2024年02月11日
    浏览(94)
  • Qt知识笔记(八)—— 鼠标和事件

    默认情况下,触发事件需要点击一下,才能触发。可设置为自动触发: setMouseTracking(true); 鼠标事件有单机,双击,释放,移动,滑轮 单机:void mousePressEvent(QMouseEvent *event); 双击:void mouseDoubleClickEvent(QMouseEvent *event); 释放:void mouseReleaseEvent(QMouseEvent *event); 移动:void mouseMove

    2024年02月16日
    浏览(67)
  • QT笔记——QSlider滑动条滚轮事件和点击鼠标位置事件问题

    需求:我们需要对一个滑动条 滚轮事件 和 点击到滑动条的位置 实时显示 问题:其中在做的时候遇到了很多的问题,一开始感觉很简单,现在将这些问题记录下来 ui图: 问题1:处理QSlider 滚轮事件的时候 这里有很大的问题,但是不知道原因,为什么会出现这样的原因,网上

    2024年02月01日
    浏览(46)
  • 【QT开发笔记-基础篇】| 第四章 事件QEvent | 4.5 键盘事件

    本章要实现的整体效果如下: QEvent::KeyPress ​ 键盘按下时,触发该事件,它对应的子类是 QKeyEvent QEvent::KeyRelease ​ 键盘抬起时,触发该事件,它对应的子类是 QKeyEvent 本节通过两个案例来讲解这 2 个事件: 键盘按下、释放事件的基本使用 通过键盘的上下左右箭头,控制标签

    2024年02月07日
    浏览(47)
  • 【QT开发笔记-基础篇】| 第四章 事件QEvent | 4.4 鼠标按下、移动、释放事件

    本章要实现的整体效果如下: QEvent::MouseButtonPress ​ 鼠标按下时,触发该事件,它对应的子类是 QMouseEvent QEvent::MouseMove ​ 鼠标移动时,触发该事件,它对应的子类是 QMouseEvent QEvent::MouseButtonRelease ​ 鼠标释放时,触发该事件,它对应的子类是 QMouseEvent 本节通过两个案例来讲

    2024年02月08日
    浏览(49)
  • Qt鼠标点击事件处理:按Escape键退出程序

    Qt 入门实战教程(目录) 首先,创建一个名称为QtKeyEscape的Qt默认的窗口程序。 参考 :Qt Creator 创建 Qt 默认窗口程序 打开Qt Creator 编辑 项目 Headers mainwindow.h 右键 class MainWindow Refactor Insert Virtual Function of Base Classes 如下图所示: 选择 QWidget keyPressEvent Insertion options: Insert defini

    2024年02月09日
    浏览(39)
  • 浏览器网页内嵌Qt-C++音视频播放器的实现,支持软硬解码,支持音频,支持录像截图,支持多路播放等,提供源码工程下载

        在浏览器中实现播放RTSP实时视频流,⼤体上有如下⼏个⽅案: ⽅案一:浏览器插件⽅案 ActiveX、NPAPI、PPAPI     ActiveX插件适用于IE浏览器,NPAPI与PPAPI插件适用于谷歌浏览器,不过这些插件都已经不被浏览器所支持。 ⽅案二:先转码再转流⽅案     ⼯作原理是架设一

    2024年01月17日
    浏览(97)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包