Qt源碼分析: QChildEvent

本文記錄QChildEvent事件相關代碼分析。

注1:限于筆者研究水平,難免有表述不當,歡迎批評指正。

注2:博文會不定期更新,敬請關注。

一、QChildEvent的發送

分析QObject::setParent代碼,當修改父對象時,便會舊parent發送QEvent::ChildRemoved事件;向新parent發送QEvent::ChildAdded事件。

/*!Makes the object a child of \a parent.\sa parent(), children()
*/
void QObject::setParent(QObject *parent)
{Q_D(QObject);Q_ASSERT(!d->isWidget);d->setParent_helper(parent);
}
void QObjectPrivate::setParent_helper(QObject *o)
{Q_Q(QObject);Q_ASSERT_X(q != o, Q_FUNC_INFO, "Cannot parent a QObject to itself");
#ifdef QT_DEBUGconst auto checkForParentChildLoops = qScopeGuard([&](){int depth = 0;auto p = parent;while (p) {if (++depth == CheckForParentChildLoopsWarnDepth) {qWarning("QObject %p (class: '%s', object name: '%s') may have a loop in its parent-child chain; ""this is undefined behavior",q, q->metaObject()->className(), qPrintable(q->objectName()));}p = p->parent();}});
#endifif (o == parent)return;if (parent) {QObjectPrivate *parentD = parent->d_func();if (parentD->isDeletingChildren && wasDeleted&& parentD->currentChildBeingDeleted == q) {// don't do anything since QObjectPrivate::deleteChildren() already// cleared our entry in parentD->children.} else {const int index = parentD->children.indexOf(q);if (parentD->isDeletingChildren) {parentD->children[index] = 0;} else {parentD->children.removeAt(index);if (sendChildEvents && parentD->receiveChildEvents) {QChildEvent e(QEvent::ChildRemoved, q);QCoreApplication::sendEvent(parent, &e);}}}}parent = o;if (parent) {// object hierarchies are constrained to a single threadif (threadData != parent->d_func()->threadData) {qWarning("QObject::setParent: Cannot set parent, new parent is in a different thread");parent = 0;return;}parent->d_func()->children.append(q);if(sendChildEvents && parent->d_func()->receiveChildEvents) {if (!isWidget) {QChildEvent e(QEvent::ChildAdded, q);QCoreApplication::sendEvent(parent, &e);}}}if (!wasDeleted && !isDeletingChildren && declarativeData && QAbstractDeclarativeData::parentChanged)QAbstractDeclarativeData::parentChanged(declarativeData, q, o);
}

因為QObject構造函數可以設置parent,此時發送QChildEvent事件,但對象并不一定創建完畢。

Refs. from QObject::childEvent(QChildEvent *)

QEvent::ChildAdded?and?QEvent::ChildRemoved?events are sent to objects when children are added or removed. In both cases you can only rely on the child being a?QObject, or if?isWidgetType() returns?true, a?QWidget. (This is because, in the?ChildAdded?case, the child is not yet fully constructed, and in the?ChildRemoved?case it might have been destructed already).

二、應用案例

在SALOME中,SUIT_Desktop通過響應QChildEvent消息來講SUIT_ViewWindow添加到SUIT_Desktop中。

class SUIT_Desktop::ReparentEvent : public QEvent
{
public:ReparentEvent( Type t, QObject* obj ) : QEvent( t ), myObj( obj ) {};QObject* object() const { return myObj; }private:QPointer<QObject> myObj;
};
/*!Child event.
*/
void SUIT_Desktop::childEvent( QChildEvent* e )
{if ( e->type() == QEvent::ChildAdded && e->child()->isWidgetType() ) {// The following line is a workaround to avoid showing view window as a top-level window// before re-parenting it to workstack (issue #23467).// See SUIT_ViewWindow::setVisible() and SUIT_Desktop::customEvent().e->child()->setProperty("blockShow", true );QApplication::postEvent( this, new ReparentEvent( QEvent::Type( Reparent ), e->child() ) );}else {QtxMainWindow::childEvent( e );}
}void SUIT_Desktop::customEvent( QEvent* e )
{if ( (int)e->type() != Reparent )return;ReparentEvent* re = (ReparentEvent*)e;SUIT_ViewWindow* wid = ::qobject_cast<SUIT_ViewWindow*>( re->object() );if ( wid ){bool invis = wid->testAttribute( Qt::WA_WState_ExplicitShowHide ) &&wid->testAttribute( Qt::WA_WState_Hidden );// The following line is a workaround to avoid showing view window as a top-level window// before re-parenting it to workstack (issue #23467).// See SUIT_ViewWindow::setVisible() and SUIT_Desktop::childEvent().wid->setProperty("blockShow", false);addWindow( wid );wid->setVisible( !invis );}
}

Refs. from?QObject::customEvent(QEvent *event)?

This event handler can be reimplemented in a subclass to receive custom events. Custom events are user-defined events with a type value at least as large as the?QEvent::User?item of the?QEvent::Type?enum, and is typically a?QEvent?subclass. The event is passed in the?event?parameter.?

/*! Constructor.*/
SUIT_ViewWindow::SUIT_ViewWindow( SUIT_Desktop* theDesktop ): QMainWindow( theDesktop ), myManager( 0 ), myIsDropDown( true ), mySyncAction( 0 )
{myDesktop = theDesktop;setWindowIcon( myDesktop ? myDesktop->windowIcon() : QApplication::windowIcon() );setAttribute( Qt::WA_DeleteOnClose );myToolMgr = new QtxActionToolMgr( this );setProperty( "VectorsMode", false );
}

網絡

QChildEventhttps://doc.qt.io/qt-6/qchildevent.html

QObject::childEvent(QChildEvent* event)https://doc.qt.io/qt-6/qobject.html#childEvent

QObject::customEvent(QEvent *event)https://doc.qt.io/qt-6/qobject.html#customEvent

SALOME源碼分析:GUI模塊https://blog.csdn.net/qq_26221775/article/details/127759145?spm=1001.2014.3001.5502

SALOME源碼分析: GUI模塊主要組件https://blog.csdn.net/qq_26221775/article/details/148845050?spm=1001.2014.3001.5502

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/84848.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/84848.shtml
英文地址,請注明出處:http://en.pswp.cn/web/84848.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《Whisper :說明書 》

[論文] [模型卡] [Colab 示例] Whisper 是一種通用的語音識別模型。它基于各種音頻的大型數據集進行訓練&#xff0c;也是一種多任務模型&#xff0c;可以執行多語言語音識別、語音翻譯和語言識別。 方法 Transformer 序列到序列模型針對各種語音處理任務進行訓練&#xff0c;…

回溯----8.N皇后

題目鏈接 /** 將n個棋子放在n*n的棋盤上,不同列,不同行,不同斜線 大致執行流程: 首先選取第一行第一格放置第一個棋子,再從第二行第一個位置開始選取合法的位置(不同行不同列不同斜線)放置棋子,重復上述流程迭代行數, 直到放置n個棋子。 若放置途中出現無合法位置的情況,回溯將…

微機電子拉伸試驗機

對于不同材料的試樣&#xff0c;由于其化學成分及組織的不同&#xff0c;在拉伸過程中會體現 出不同的物理現象及力學性質。西安力創&#xff08;LETRY&#xff09;公司專業制造WDL/WDW系列微機控制電子萬能試驗機&#xff0c;主要適用于金屬板材、棒材、管材、金屬絲、金屬箔、…

【數據結構與算法】數據結構核心概念系統梳理

第一章 緒論:基礎概念體系 ??算法:問題求解步驟的描述。 ??非遞歸的算法效率更高。 1.1 邏輯結構 vs 存儲結構 維度邏輯結構存儲結構(物理結構)定義數據元素之間的邏輯關系數據結構在計算機中的實現方式分類線性/樹形/圖/集合順序/鏈式/索引/散列獨立性獨立于存儲結構…

73頁PPT | 大數據平臺規劃與數據價值挖掘應用咨詢項目解決方案

推薦摘要&#xff1a;在數字化浪潮中&#xff0c;企業數據量呈幾何級增長&#xff0c;卻常因缺乏科學規劃的大數據平臺&#xff0c;陷入數據孤島、處理效率低下的困境&#xff0c;難以充分挖掘數據價值。特推出大數據平臺規劃與數據價值挖掘應用咨詢項目解決方案&#xff0c;正…

gRPC 與 Protobuf 的深度集成 —— 從服務定義到多語言交互(Go + Java 示例)

在前幾篇文章中&#xff0c;我們已經掌握了 Protobuf 的基礎語法、高級特性和序列化反序列化操作。本篇文章將深入講解 gRPC 與 Protobuf 的集成&#xff0c;重點介紹如何通過 .proto 文件定義服務接口&#xff0c;并在 Go 和 Java 中實現 gRPC 服務與客戶端的完整交互流程。我…

可信計算的基石:TPM技術深度解析與應用實踐

可信計算的基石&#xff1a;TPM技術深度解析與應用實踐 引言&#xff1a;數字世界的"信任之錨" 在數據泄露事件頻發的時代&#xff0c;傳統軟件級安全防護已力不從心。TPM&#xff08;可信平臺模塊&#xff09;作為硬件級安全解決方案&#xff0c;正成為現代計算設…

「ECG信號處理——(18)基于時空特征的心率變異性分析」2025年6月23日

一、HRV概述 心率變異性&#xff08;Heart rate variability ,HRV&#xff09;分析是通過測量分析連續正常R-R間期的時間變化來反映心率的變化程度的&#xff0c;根據計算RR 序列的統計指標&#xff0c;或者是畫出RR間期的直方圖和散點圖來反映HRV的大小情況。下面我們從男性與…

【學習筆記】深入理解Java虛擬機學習筆記——第10章 前端編譯與優化

第10章 前端編譯與優化 10.1 概述 1>前端編譯器&#xff1a;Javac命令。 【.java文件->.class文件】 2>即時編譯器&#xff1a;Hotspot.C1.C2 【.class文件->機器碼】 3>提前編譯器&#xff1a;JDK的Jaotc等【.java->機器碼】 10.2 Javac 編譯器 10.2.1 …

Python 區塊鏈與Web3開發指南

https://www.python.org/static/community_logos/python-logo-master-v3-TM.png 區塊鏈基礎概念 區塊鏈核心特性 python 復制 下載 class Block:def __init__(self, index, timestamp, data, previous_hash):self.index indexself.timestamp timestampself.data datas…

工業智能體調參閉環:從物料感知到智慧工藝的落地路徑

用戶定義目標&#xff1a;智能工藝的起點不是機器&#xff0c;而是人 在智能制造系統中&#xff0c;工藝調優的第一步并非直接依賴AI或自動化設備&#xff0c;而是始于用戶的明確輸入。用戶需要在系統中定義產品的工藝要求&#xff0c;包括目標尺寸與規格&#xff08;如長寬高…

【Linux學習筆記】進程間通信之共享內存

【Linux學習筆記】進程間通信之共享內存 &#x1f525;個人主頁&#xff1a;大白的編程日記 &#x1f525;專欄&#xff1a;Linux學習筆記 文章目錄 【Linux學習筆記】進程間通信之共享內存前言一. system V共享內存1.1 共享內存數據結構1.2 共享內存函數1.3 共享內存實現通信…

郭碧婷闖入女團賽道 與劉忻張予曦蔡詩蕓組成ROLLING SISTERS

近日&#xff0c;郭碧婷與劉忻、張予曦、蔡詩蕓組成的女團ROLLING SISTERS正式官宣&#xff0c;并發布《Rolling Life》《Alpha》兩首單曲&#xff01; 此次幾位姐姐的組合讓大家眼前一亮&#xff0c;尤其是郭碧婷造型顛覆以往。銀灰色挑染短發搭配棱角分明的黑色煙熏妝&#x…

2025再升級:醫療數智立體化體系V2.0架構簡介

在醫療數智立體化體系第一版基礎上,融入量子物理的第一性原理計算、人工智能(AI)、高性能云計算(HPC)和標準化機器人自動化整合成“醫療數智立體化體系2.0”,代表了醫療研發未來的重要發展方向。這個體系的核心在于深度融合物理世界規律、智能計算與自動化執行,為醫療AI…

Day40 訓練和測試的規范寫法

目錄 一、彩色和灰度圖片測試和訓練的規范寫法&#xff1a;封裝在函數中 單通道圖片的規范寫法 彩色圖片的規范寫法 二、展平操作&#xff1a;除第一個維度batchsize外全部展平 圖像任務中的張量形狀 NLP任務中的張量形狀 1. Flatten操作 2. view/reshape操作 總結 三…

Linux 文件 I/O 與標準 I/O 緩沖機制詳解

一、什么是標準 I/O&#xff1f;&#xff08;FILE* 接口&#xff09; 標準 I/O 是 C 標準庫為我們提供的一套高級文件操作接口&#xff0c;核心基于結構體 FILE&#xff0c;常見函數如&#xff1a; fopen() / fclose() fread() / fwrite() fprintf() / fscanf() fflush() /…

C++的前世今生-C++11

C98&#xff08;ISO/IEC 14882:1998&#xff09; C98 是 C 的第一個標準化版本&#xff08;ISO/IEC 14882:1998&#xff09;&#xff0c;它正式確立了 C 的核心語言特性和標準庫。以下是 C98 的主要特性總結&#xff1a; 一、核心語言特性** 模板&#xff08;Templates&…

詞編碼模型怎么進行訓練的,輸出輸入是什么,標簽是什么

詞編碼模型怎么進行訓練的,輸出輸入是什么,標簽是什么 詞編碼模型的訓練本質是通過數據驅動的方式,將離散的文本符號映射為連續的語義向量。 一、訓練機制:從符號到向量的映射邏輯 1. 核心目標 將單詞/子詞(Token)映射為低維向量,使語義相關的詞在向量空間中距離更近…

【Linux指南】文件管理高級操作(復制、移動、查找)

引言 在Linux系統管理中&#xff0c;文件的復制、移動與查找是比基礎操作更進階的核心技能&#xff0c;它們構成了高效管理文件系統的"三駕馬車"。當我們需要備份重要數據、重構目錄結構或在龐大的文件系統中定位目標文件時&#xff0c;cp、mv、find等命令將成為最得…

【棧】-----【小C的記事本】

小C的記事本 題目描述 小C最近學會了 Java 小程序的開發&#xff0c;他很開心&#xff0c;于是想做一個簡單的記事本程序練練手。 他希望他的記事本包含以下功能&#xff1a; append(str)&#xff1a;向記事本插入字符串 str&#xff08;英文字符&#xff09;。delete(k)&am…