当前位置: 首页 > news >正文

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.dtcms.com/a/190566.html

相关文章:

  • Java 框架配置自动化:告别冗长的 XML 与 YAML 文件
  • [Linux] vim及gcc工具
  • 本地部署小红书FireRedASR
  • Vue百日学习计划Day4-8——Gemini版
  • 基于javaweb的SpringBoot自习室预约系统设计与实现(源码+文档+部署讲解)
  • 算法题(146):最大子段和
  • Pass-the-Hash攻击原理与防御实战指南
  • Python × CARLA:如何在自动驾驶仿真世界里打造智能驾驶系统?
  • ElasticSearch深入解析(十二):聚合——分桶聚合、指标聚合、管道子聚合
  • 歌词滚动效果
  • Docker镜像操作全攻略:从查看、拉取到删除
  • Stable Diffusion WebUI 插件大全:功能详解与下载地址
  • 命令行快速上传文件到SFTP服务器(附参考示例)
  • 配置Spark环境
  • 从规则驱动到深度学习:自然语言生成的进化之路
  • 人机环境体系的自主决策与机器系统的自主决策不同
  • 3337. 字符串转换后的长度 II
  • 微服务商城(1)开篇、服务划分
  • LLM(大语言模型)部署加速方法——PagedAttention
  • 【第六课】ESP32-S3 BLE 与 WiFi 一体化通信示例
  • 从0开始学linux韦东山教程第三章问题小结(4)
  • 内存分配器ptmalloc2、tcmalloc、jemalloc,结构设计、内存分配过程详解
  • fiftyone-数据库配置和config与app_config配置文件
  • 耐压击穿测试的原理、流程及应用领域
  • SymPy | 如何提取指定项的系数
  • LeetCode 820 单词的压缩编码题解
  • 笔记本电脑打开网页很慢,一查ip地址网段不对怎么处理
  • 数学建模初等模型应用
  • 影刀RPA网页自动化总结
  • TCP 三次握手建立连接详解