В pyqt можно получить доступ к wid как sip.voidptr, используя widget.winId(), а затем превратить его в капсульный объект, используя wid.ascapsule()
В pyside6 при использовании widget.winId() я могу получить только целое число.
Как я могу получить winId() как ptr, например pyqt, при использовании pyside6?
Мне нужен ptr как капсула, потому что API, который я использую, выдает следующую ошибку:
return WNT_Window(ctypes.c_void_p(wid))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: __init__(): incompatible constructor arguments. The following argument types are supported:
1. OCP.WNT.WNT_Window(theTitle: str, theClass: OCP.WNT.WNT_WClass, theStyle: int, thePxLeft: int, thePxTop: int, thePxWidth: int, thePxHeight: int, theBackColor: OCP.Quantity.Quantity_NameOfColor = <Quantity_NameOfColor.Quantity_NOC_MATRAGRAY: 2>, theParent: capsule = None, theMenu: capsule = None, theClientStruct: capsule = None)
2. OCP.WNT.WNT_Window(theHandle: capsule, theBackColor: OCP.Quantity.Quantity_NameOfColor = <Quantity_NameOfColor.Quantity_NOC_MATRAGRAY: 2>)
Мне нужно передать winId в WNT_Window() из ocp, который принимает ptr.
Попробуйте использовать ctypes для создания капсулы из void ptr: stackoverflow.com/q/65056619/984421.
Я могу получить int только при использовании pyside6, я не могу получить void ptr.
Но вы можете создать void ptr из wid, используя ctypes.
Пожалуйста, дайте мне более подробную информацию
Так или иначе, вы должны заставить ctypes делать то, чего PySide сделать не может. В своем комментарии выше я уже предлагал кое-что попробовать: например, использовать ctypes.pythonapi для создания PyCapsule с типом результата c_void_p. Может сработать что-то вроде следующего: GP = ctypes.pythonapi.PyCapsule_GetPointer; GP.restype = ctypes.c_void_p; GP.argtypes = [ctypes.py_object]; capsule = GP(widget.winId(), None). (Я не могу проверить ничего из этого сам, поскольку у меня нет доступа к системе Windows).






Наконец-то все заработало, большое спасибо @ekhumoro.
Мое решение:
1.конвертировать winId в void_pointer
wid = widget.winId
ptr = ctypes.cast(wid, ctypes.POINTER(ctypes.c_void_p))
PyCapsule_Destructor = ctypes.CFUNCTYPE(None, ctypes.py_object)
PyCapsule_New = ctypes.pythonapi.PyCapsule_New
PyCapsule_New.restype = ctypes.py_object
PyCapsule_New.argtypes = (ctypes.c_void_p, ctypes.c_char_p, PyCapsule_Destructor)
capsule = PyCapsule_New(ptr, None, PyCapsule_Destructor(0))
Зачем вам нужен объект-капсула? Почему бы просто не преобразовать
voidptrвint?