获取pyqt winID句柄将其传递给c ++

时间:2017-09-20 16:08:42

标签: c++ pyqt

我有一个叫做的函数:

bool game_init(void* window);

获取一个指向窗口句柄的指针,基本上它只是初始化opengl,并从c ++进行渲染(我使用boost :: python将此函数导出到python),现在我创建了一个简单的hello word窗口,试一试。

app = QtWidgets.QApplication(["",""])
window = QtWidgets.QMainWindow()
winid = window.winId()
ctypes.pythonapi.PyCapsule_GetPointer.restype = ctypes.c_void_p
ctypes.pythonapi.PyCapsule_GetPointer.argtypes = [ctypes.py_object, ctypes.c_char_p]
handle = ctypes.pythonapi.PyCapsule_GetPointer(winid.ascapsule() , None)

有趣的是,我所做的只是一个像85983252这样的整数,我想它是hello world窗口的句柄,但是如何将这个整数作为void *传递给我,这样我的c ++代码就可以了使用它创建一个opengl窗口? 目前错误给了我:python参数bool game_init(int);与cpp代码不匹配。

environment:
Linux,pyqt5 boost::python gcc,python 3.4

3 个答案:

答案 0 :(得分:0)

winid返回的window.winId()是无符号整数指针(用C / C ++术语)。所以你的handle也是。

希望您已经加载了共享对象库,该库具有" C"功能

然后通过使用库对象调用C函数来传递句柄。

之类的,

lib.game_init(handle)

答案 1 :(得分:0)

我有Windows的winID句柄,所以

class CamViewWidget(QtGui.QWidget):
...
def on_sync_message(self, bus, message):
    if message.get_structure().get_name() == 'prepare-window-handle':
        message.src.set_property('force-aspect-ratio', True)
        message.src.set_window_handle(self.winId().__int__())

答案 2 :(得分:0)

winId()返回sip.voidptr对象。要在诸如MessageBoxA之类的WinAPI中使用它,您需要通过int()对其进行转换。

hWnd = int(QWidget.winId())
ctypes.windll.user32.MessageBoxA(hWnd,"Hi","Hi", 0x40)