我有一个叫做的函数:
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
答案 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)