Как csat дескриптор WinID для капсулы в pyside6

В 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>)

Зачем вам нужен объект-капсула? Почему бы просто не преобразовать voidptr в int?

ekhumoro 13.04.2024 20:45

Мне нужно передать winId в WNT_Window() из ocp, который принимает ptr.

C-Entropy 14.04.2024 03:52

Попробуйте использовать ctypes для создания капсулы из void ptr: stackoverflow.com/q/65056619/984421.

ekhumoro 14.04.2024 22:56

Я могу получить int только при использовании pyside6, я не могу получить void ptr.

C-Entropy 15.04.2024 05:21

Но вы можете создать void ptr из wid, используя ctypes.

ekhumoro 15.04.2024 10:40

Пожалуйста, дайте мне более подробную информацию

C-Entropy 15.04.2024 13:38

Так или иначе, вы должны заставить 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 15.04.2024 23:02
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
7
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Наконец-то все заработало, большое спасибо @ekhumoro.

Мое решение:

1.конвертировать winId в void_pointer

wid = widget.winId
ptr = ctypes.cast(wid, ctypes.POINTER(ctypes.c_void_p)) 
  1. создать PyCapsule
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))

Другие вопросы по теме