当前位置: 首页 > backend >正文

qobject与event事件应用

int main(int argc, char *argv[]) {QApplication a(argc, argv);MyWidget mainWidget;mainWidget.setWindowTitle("QObject与事件处理示例");mainWidget.resize(200, 200);mainWidget.show();return a.exec();
}

  • QApplication a(argc, argv);:创建 QApplication 对象,初始化应用程序的资源和事件循环。
  • MyWidget mainWidget;:创建 MyWidget 类的实例,调用其构造函数。
  • mainWidget.setWindowTitle("QObject与事件处理示例");:设置窗口标题。
  • mainWidget.resize(200, 200);:设置窗口大小为 200x200 像素。
  • mainWidget.show();:显示窗口。
  • a.exec();:启动 Qt 的主事件循环,程序开始等待用户输入或系统事件。
2. MyWidget 构造函数部分

cpp

explicit MyWidget(QWidget *parent = nullptr) : QWidget(parent) {// 创建一个子对象(QLabel),父对象为MyWidgetQLabel *childLabel = new QLabel("点击区域", this);childLabel->setObjectName("childLabel"); // 设置对象名称用于过滤识别childLabel->setGeometry(50, 50, 100, 30);// 安装事件过滤器到子控件childLabel->installEventFilter(this);
}

  • QLabel *childLabel = new QLabel("点击区域", this);:创建一个 QLabel 子控件,显示文本 “点击区域”,并将 MyWidget 作为其父对象。
  • childLabel->setObjectName("childLabel");:为 QLabel 设置对象名称,方便在事件过滤器中识别。
  • childLabel->setGeometry(50, 50, 100, 30);:设置 QLabel 的位置和大小。
  • childLabel->installEventFilter(this);:为 QLabel 安装事件过滤器,将 MyWidget 作为事件过滤器对象。
3. 事件处理部分
点击 MyWidget 非子控件区域

当用户在 MyWidget 的非子控件区域点击鼠标左键时,会触发 mousePressEvent 函数:

cpp

void mousePressEvent(QMouseEvent *event) override {if (event->button() == Qt::LeftButton) {qDebug() << "[对象处理] 左键点击位置:" << event->pos();event->accept(); // 阻止事件传递} else {QWidget::mousePressEvent(event); // 其他事件交由父类处理}
}

  • 执行结果:控制台会输出点击位置的信息,格式为 [对象处理] 左键点击位置: (x, y),其中 (x, y) 是点击位置的坐标。
  • 事件流程:事件直接由 MyWidget 的 mousePressEvent 函数处理,由于调用了 event->accept(),事件不会继续传递给父控件。
点击 QLabel 子控件区域

当用户点击 QLabel 子控件时,事件会先经过事件过滤器:

cpp

bool eventFilter(QObject *watched, QEvent *event) override {if (watched->objectName() == "childLabel" && event->type() == QEvent::MouseButtonPress) {QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);qDebug() << "[事件过滤器] 子控件被点击,全局坐标:" << mouseEvent->globalPos();return true; // 拦截事件,不再传递到子控件的mousePressEvent}return QWidget::eventFilter(watched, event); // 其他事件继续传递
}

  • 执行结果:控制台会输出子控件被点击的全局坐标信息,格式为 [事件过滤器] 子控件被点击,全局坐标: (x, y),其中 (x, y) 是全局屏幕坐标。
  • 事件流程:事件被 MyWidget 的事件过滤器拦截,不会继续传递到 QLabel 的 mousePressEvent 函数。

总结

  • 当点击 MyWidget 非子控件区域时,会触发 mousePressEvent 函数,输出点击位置信息并阻止事件传递。
  • 当点击 QLabel 子控件区域时,事件会先经过事件过滤器,输出全局坐标信息并拦截事件,不会传递到 QLabel 的 mousePressEvent 函数。

编辑

http://www.xdnf.cn/news/2332.html

相关文章:

  • 碰撞检测的艺术:Pygame中的Rect与像素级检测
  • 第三方测试机构如何保障软件质量并节省企业成本?
  • Unity text 表情和超链接解决方案。
  • 贝叶斯算法学习
  • 微服务架构下 MySQL 大表分库分表方案
  • 记录前端vue3封装一个modal弹框
  • 【思维】GCD
  • 巧用 Element - UI 实现图片上传按钮的智能隐藏
  • RK3568 Debian调试记录
  • PROFINE转EtherCAT网关模块实现西门子PLC与欧姆龙NJ系列PLC协议转换实战
  • 用Xshell8配置密钥登陆
  • 正则表达式三剑客之——grep和sed
  • 04-谷粒商城笔记
  • 05_BootStrap
  • [MySQL数据库] 事务与锁
  • DIY 3D打印机 原理及步骤概况
  • Java----super 关键字
  • 《ATPL地面培训教材13:飞行原理》——第13章:高速飞行
  • Linux进程解析
  • 信息系统项目管理师备考计划
  • 摸鱼屏保神器工具软件下载及使用教程
  • C#里使用libxl来加载网络传送过来的EXCEL文件
  • 计算机二级MS Office第一套演示文稿
  • 图解 Redis 事务 ACID特性 |源码解析|EXEC、WATCH、QUEUE
  • 【数据湖】Time Travel时间旅行
  • 每日学习Java之一万个为什么?
  • 3.1 掌握RDD的创建
  • 英语学习4.26
  • 进行物联网安全PoC时的注意事项
  • 【Java-Day 1】开启编程之旅:详解Java JDK安装、环境配置与运行HelloWorld