<Qt>事件的accept()与ignore()的传递

事件是Qt中比较难理解的概念,需要花费大量时间钻研。


下面简单讲解 accept() 与 ignore() 在程序中的传递逻辑:


1、存在基类 A,其子类 B,层次部件 mainwindow,分别创建类的实例 testA 、 testB(&mainwindow)


2、testB收到 事件C,若选择 accept() 则由testB处理;若选择 ignore() 则传递至 mainwindow 接收处理;


3、可见,事件的传递是在组件逻辑层上的,而不是类继承层上的


4、事件的传递逻辑遵循后进先出原则,从部件最外层开始传递事件:testB->mainwindow->QMainWindow->QWidget->QObject


希望大家有所收获,新手一名,如有出错烦请指教

好的,这是一个关于QPushButton对象的事件处理的例子: ```cpp class MyPushButton : public QPushButton { public: MyPushButton(QWidget* parent = nullptr) : QPushButton(parent) {} bool event(QEvent* e) override { if (e->type() == QEvent::MouseButtonPress) { qDebug() << "鼠标按下"; e->accept(); // 消费事件,不传递给父级 return true; } else if (e->type() == QEvent::MouseButtonRelease) { qDebug() << "鼠标释放"; e->ignore(); // 不消费事件传递给父级 return false; } else { return QPushButton::event(e); // 其他事件交给父类处理 } } }; ``` 在这个例子中,我们自定义了一个QPushButton的子类,重载了它的event()函数,来处理鼠标按下和释放事件。如果是鼠标按下事件,我们打印一条消息,并消费事件(不传递给父级处理)。如果是鼠标释放事件,我们同样打印一条消息,但不消费事件(继续传递给父级处理)。对于其他事件,我们直接交给父类去处理。 现在我们可以在代码中创建这个自定义按钮,并测试它的事件处理: ```cpp MyPushButton* button = new MyPushButton("测试按钮"); button->show(); ``` 当我们点击这个按钮时,会在控制台输出"鼠标按下",当我们释放按钮时,会输出"鼠标释放"。由于我们在鼠标按下事件中消费了事件,所以鼠标释放事件不会触发按钮的clicked()信号。 在这个例子中,我们使用了accept()和ignore()函数。这两个函数通常用于处理一些特定的事件,例如QKeyEvent。当我们在重载keyPressEvent()函数时,如果我们想消费某个特定按键的事件,可以调用accept()函数,否则调用ignore()函数。这样做可以防止事件传递给父级,或者被其他控件消费。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值