添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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  )
一.对话框QDialog
          之前有说到,QDialog类负责对话框部件,继承于QWidget类。对话框一般用于实现用户交互,弹出一个顶层窗口。很多不适合放在主窗口的功能都可以放在对话框中。
          QDialog类及其子类对于parent指针有特别的设置:如果parent为NULL,那么该对话框独立作为一个顶层窗口;若paren
				
在没有接触Gdiplus之前,在vc中绘制图片,通常加载一张位图,然后进行贴图。对于现在多种多样的图片格式,之前的GDI并不支持(应该是这样的,呵呵)。而使用Gdiplus则可以选择多种图片格式,比如BMP, ICON, GIF, JPEG, Exif, PNG, TIFF, WMF, and EMF。 下面就介绍下首次接触Gdiplus的一个简单应用。 一、包括相应的头文件及引入
在写MFC程序时,当需要动态创建一些控件的时候,需要传递一个ID给相应的控件,比如创建一个按钮 CButton m_bnTestButton; m_bnTestButton.Create( _T("我的按钮"), WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON, CRect( 10, 10, 80, 40 ), this, IDC_MY_BTN );     我们知道,
::SetCursor( ::LoadCursor( NULL, IDC_HAND )  ); LoadCursor第一个参数必须为NULL,否则会载入失败。如果以以下方式调用,则会失败: ::SetCursor(  ::LoadCursor( AfxGetApp()->LoadCursor( IDC_HAND ) ) ); 或::
使用GetClientRect与GetWindowRect 计算水平、垂直非客户区大小 使用GetWindowRect获取主窗口的大小, 再通过GetClientRect获取客户端大小,然后通过这两个值计算出水平、垂直非客户区占的大小 计算主窗口大小 由上一步计算得到的非客户区大小加大期望的客户区大小,即为主窗口的大小 以下是设置非客户区大小为500*300的例子: CRect clien