Python筆記:c++內嵌python,c++主窗口如何傳遞給腳本中的QDialog,使用的是pybind11

1. 問題描述

用的是python 3.8.20, qt版本使用的是5.15.2, PySide的版本是5.15.2, pybind11的版本為2.13.6

網上說在python腳本中直接用PySide2自帶的QWinWidget,如from PySide2.QtWinExtras import QWinWidget,但我用的版本中說沒有QWinWidget,所以就網上找了QWinWidget的源碼,直接
在c++宿主程序中編譯,后使用pybind11導出到解釋器:

開始想到的是直接構造一個隱藏的QWidget,關聯的是MFC的主窗口句柄,然后將指針導出到解釋器,

PYBIND11_EMBEDDED_MODULE(TestApp, m)
{m.def("GetMainWidget", []() { static auto pWidget = new QWinWidget(AfxGetMainWnd()->m_hWnd);return pWidget; });
}

然后再Python腳本端

dlg = MyUIDialog( TestApp.GetMainWidget )

但執行時提示如下錯誤

TypeError: ‘PySide2.QtWidgets.QDialog’ called with wrong argument
types: PySide2.QtWidgets.QDialog(QWinWidget) Supported signatures:
PySide2.QtWidgets.QDialog(typing.Union[PySide2.QtWidgets.QWidget,
NoneType] = None, PySide2.QtCore.Qt.WindowFlags =
Default(Qt.WindowFlags))

以為是不識別基類,直接構造QWidget

PYBIND11_EMBEDDED_MODULE(TestApp, m)
{m.def("GetMainWidget", []() { static auto pWidget = new QWidget();return pWidget; });
}

但執行時提示如下錯誤

TypeError: ‘PySide2.QtWidgets.QDialog’ called with wrong argument types:
PySide2.QtWidgets.QDialog(QWidget)
Supported signatures:
PySide2.QtWidgets.QDialog(typing.Union[PySide2.QtWidgets.QWidget, NoneType] = None, PySide2.QtCore.Qt.WindowFlags = Default(Qt.WindowFlags))

看樣子,PySide2只認識PySide2.QtWidgets.QWidget,不任務QWidget呀。

2. 解決方案

后面查找資料得知,需要使用PySide2中的QtWidgets.QWidget.find,在腳本環境中重新獲得Widget指針才行,find在windows下接受的是個winId

PYBIND11_EMBEDDED_MODULE(TestApp, m)
{m.def("GetMainWidget", []() { static auto pWidget = new QWinWidget(AfxGetMainWnd()->m_hWnd);return pWidget->winId(); });
}

python腳本:

main_window = QtWidgets.QWidget.find(TestApp.GetMainWidget())   # 通過Qt API轉換指針
dlg = MyUIDialog( main_window  )

在這里插入圖片描述

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

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

相關文章

軟考軟件設計師中級——軟件工程筆記

1.軟件過程 1.1能力成熟度模型(CMM) 軟件能力成熟度模型(CMM)將軟件過程改進分為以下五個成熟度級別,每個級別都定義了特定的過程特征和目標: 初始級 (Initial): 軟件開發過程雜亂無章&#xf…

C# SQLite基本使用示例

目錄 1 基本使用流程 1.1 步驟1:添加SQLite依賴 1.2 ?步驟2:建立連接 1.3 步驟3:執行SQL命令 1.4 步驟4:查詢數據 1.5 步驟5:使用事務 2 SQLite基本使用示例 2.1 準備工作 2.2 完整示例 2.3 案例代碼解析 …

視頻圖像壓縮領域中 DCT 的 DC 系數和 AC 系數詳解

引言 在數字圖像與視頻壓縮領域,離散余弦變換(Discrete Cosine Transform, DCT)憑借其卓越的能量集中特性,成為JPEG、MPEG等國際標準的核心技術。DCT通過將空域信號映射到頻域,分離出DC系數(直流分量&…

對抗系統熵增:從被動救火到主動防御的穩定性實戰

📕我是廖志偉,一名Java開發工程師、《Java項目實戰——深入理解大型互聯網企業通用技術》(基礎篇)、(進階篇)、(架構篇)清華大學出版社簽約作家、Java領域優質創作者、CSDN博客專家、…

java 中 DTO 和 VO 的核心區別

DTO 和 VO 的核心區別 特性DTO(數據傳輸對象)VO(視圖對象)設計目的服務層與外部系統(如前端、其他服務)之間的數據傳輸為前端展示層定制數據,通常與 UI 強綁定數據內容可能包含業務邏輯需要的字…

數據結構【二叉樹的遍歷實現】

📘考研數據結構基礎:二叉樹的存儲、遍歷與隊列輔助實現詳 在數據結構的學習中,二叉樹作為一種結構清晰、應用廣泛的樹形結構,是考研計算機專業課中重點內容之一。本文將以實際代碼為基礎,介紹二叉樹的存儲結構、遍歷方…

無人機俯視風光攝影Lr調色預設,手機濾鏡PS+Lightroom預設下載!

調色詳情 無人機俯視風光攝影 Lr 調色是利用 Adobe Lightroom 軟件,對無人機從俯視角度拍攝的風光照片進行后期處理的調色方式。通過調整色彩、對比度、光影等多種參數,能夠充分挖掘并強化畫面獨特視角下的壯美與細節之美,讓原本平凡的航拍風…

【springcloud學習(dalston.sr1)】Eureka服務端集群的搭建(含源代碼)(二)

該系列項目整體介紹及源代碼請參照前面寫的一篇文章【springcloud學習(dalston.sr1)】項目整體介紹(含源代碼)(一) 這篇文章主要介紹多個eureka服務端的集群環境是如何搭建的。 (一)eureka的簡要說明 Eu…

互聯網大廠Java求職面試實戰:Spring Boot微服務與數據庫優化詳解

💪🏻 1. Python基礎專欄,基礎知識一網打盡,9.9元買不了吃虧,買不了上當。 Python從入門到精通 😁 2. 畢業設計專欄,畢業季咱們不慌忙,幾百款畢業設計等你選。 ?? 3. Python爬蟲專欄…

事件驅動reactor的原理與實現

fdset 集合:(就是說) fd_set是一個位圖(bitmap)結構 每個位代表一個文件描述符 0表示不在集合中,1表示在集合中 fd_set結構(簡化): [0][1][2][3][4][5]...[1023] …

一分鐘在Cherry Studio和VSCode集成火山引擎veimagex-mcp

MCP的出現打通了AI模型和外部數據庫、網頁API等資源,成倍提升工作效率。近期火山引擎團隊推出了 MCP Server SDK: veimagex-mcp。本文介紹如何在Cherry Studio 和VSCode平臺集成 veimagex-mcp。 什么是MCP MCP(Model Context Protocol&…

掌控隨心 - 服務網格的流量管理藝術 (Istio 實例)

掌控隨心 - 服務網格的流量管理藝術 (Istio 實例) 想象一下,沒有服務網格的時候,我們要實現像“將 1% 的用戶流量導入到新版本應用”、“根據用戶設備類型訪問不同后端”、“模擬下游服務故障”這類高級流量策略,通常需要在代碼、負載均衡器、API 網關等多個地方進行復雜且分…

[ARM][匯編] 01.基礎概念

目錄 1.全局標號 1.1.使用方法 1.1.1.聲明全局標號 1.1.2.定義全局標號 1.1.3.引用全局標號 1.2.全局標號與局部標號的區別 1.3.注意事項 2.局部標號 2.1.使用方法 2.1.1.定義局部標號 2.1.2.跳轉引用 2.2.局部標號與全局標號的對比 2.3.注意事項 3.符號定義偽指…

如何使用遠程桌面控制電腦

目的: 通過路由器使用pc控制臺式機,實現了有線/無線pc與臺式機的雙向遠程桌面控制 最核心就兩條:get ip地址與被控制機器的賬戶與密碼。 現象挺神奇:被控制電腦的電腦桌面處于休眠模式,此時強行喚醒被控電腦會導致中斷…

Hive表JOIN性能問

在處理100TB的Hive表JOIN性能問題時,需采用分層優化策略,結合數據分布特征、存儲格式和計算引擎特性。以下是系統性優化方案: 1. 數據傾斜優化(Skew Join) 1.1 識別傾斜鍵 方法:統計JOIN鍵的分布頻率&…

MongoDB 的核心概念(文檔、集合、數據庫、BSON)是什么?

MongoDB 是一個面向文檔的數據庫,它的核心概念與傳統的關系型數據庫(RDBMS)有所不同。以下是它的四個主要核心概念: 文檔 (Document) 定義: 文檔是 MongoDB 中的基本數據單元。它類似于關系型數據庫中的一行記錄&#…

AI智慧公園管理方案:用科技重塑市民的“夜游體驗”

AI智慧公園管理方案:多場景智能巡檢與安全防控 一、背景與痛點分析 夏季夜間,公園成為市民休閑娛樂的核心場所,但管理難度隨之激增: 寵物管理失控:未牽繩寵物進入園區,隨地排泄、驚擾游客,甚…

Spring Cloud Gateway 聚合 Swagger 文檔:一站式API管理解決方案

前言 在微服務架構中,隨著服務數量的增加,API文檔管理變得越來越復雜。每個微服務都有自己的Swagger文檔,開發人員需要記住每個服務的文檔地址,這無疑增加了開發難度。本文將介紹如何使用Spring Cloud Gateway聚合所有微服務的Sw…

尼康VR鏡頭防抖模式NORMAL和ACTIVE的區別(私人筆記)

1. NORMAL 模式(常規模式) 適用場景:一般手持拍攝,比如人像、靜物、風景或緩慢平移鏡頭(如水平追拍)等。工作特性: 補償手抖引起的小幅度震動(比如手持時自然的不穩)&am…

Babylon.js學習之路《四、Babylon.js 中的相機(Camera)與視角控制》

文章目錄 1. 引言:為什么相機是 3D 場景的“眼睛”?1.1 相機的核心作用1.2 常見相機類型概覽 2. 相機基礎參數解析2.1 通用屬性2.2 相機坐標系 3. 詳解常用相機類型3.1 自由相機(FreeCamera)3.2 弧形旋轉相機(ArcRotat…