[英]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.