[英]How to make a QEvent that bubbles up to parent QObjects?
我需要创建一个GUI按钮,告诉它的父母(或父母的父母甚至父母的父母的父母 ...)应该在QStackedLayout
中显示不同的小部件。 我创建了一个自定义QEvent:
class SwitchScreenEventWidget : public QEvent {
public:
SwitchScreenEventWidget(QWidget* w) : SwitchScreenEvent(), widget(w) {
if(widget==nullptr)
throw "SwitchScreenEventWidget received null widget.";
}
virtual QWidget* getWidget() const {;return widget;}
private:
QWidget* const widget;
};
我这样调用它:
// Through debugger I checked that this is getting called properly
void GraphButton::buttonClicked()
{
if(qApp!=nullptr && parent()!=nullptr)
qApp->notify(parent(), new SwitchScreenEventWidget(getGraph()));
}
并按以下方式处理:
bool ViewStack::eventFilter(QEvent* e)
{
if(e->type()>=QEvent::User) {
if(SwitchScreenEvent* event = dynamic_cast<SwitchScreenEvent*>(e)) {
// Show the given widget
}
return true;
}
return false;
}
我使用eventFilter
,然后将其注册到主应用程序小部件。 但是事件没有被捕获。 我在某个地方读过一些QEvent
只是根本不了解层次结构。
那么所有事件是否都会冒泡? 如果不是,哪个做,哪个不做,为什么? 以及如何使活动泡沫正确?
我认为对您来说最好的方法是将QApplication
子类化,重写notify
方法并自己执行“冒泡事件”。 我很确定鼠标和键盘事件会通过这种方法“冒泡”,而其他事件不会。
布尔QCoreApplication :: notify(QObject *接收器,QEvent *事件)
发送事件到接收者:接收者->事件(事件)。 返回从接收者的事件处理程序返回的值。 请注意,对于发送到任何线程中任何对象的所有事件,将调用此函数。
对于某些类型的事件(例如,鼠标和按键事件),如果接收者对该事件不感兴趣(即,它返回false),则该事件将传播到接收者的父对象,依此类推直至顶级对象。
因此,您可以通过实现更改此行为。
另外关于您的代码示例。 我认为这张支票
if( qApp!=nullptr )
是无用的,因为您总是会有qApp的实例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.