首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取pyqt winID句柄将其传递给c++

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

Stack Overflow用户
提问于 2017-09-21 00:08:42
回答 3查看 1.3K关注 0票数 0

我有一个名为:

代码语言:javascript
复制
bool game_init(void* window);

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

代码语言:javascript
复制
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代码不匹配。

代码语言:javascript
复制
environment:
Linux,pyqt5 boost::python gcc,python 3.4
EN

回答 3

Stack Overflow用户

发布于 2017-09-21 01:23:16

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

希望您已经加载了共享对象库,它具有"C“函数。

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

像这样,

代码语言:javascript
复制
lib.game_init(handle)
票数 0
EN

Stack Overflow用户

发布于 2019-01-24 02:00:26

我有windows的winID句柄,所以

代码语言:javascript
复制
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__())
票数 0
EN

Stack Overflow用户

发布于 2020-09-22 19:34:54

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

代码语言:javascript
复制
hWnd = int(QWidget.winId())
ctypes.windll.user32.MessageBoxA(hWnd,"Hi","Hi", 0x40)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46326933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档