【问题标题】:Getting pyqt winID handle pass it to c++获取 pyqt winID 句柄将其传递给 c++
【发布时间】:2018-03-01 19:16:06
【问题描述】:

我有一个函数叫做:

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 parameter bool game_init(int);与 cpp 代码不匹配。

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

【问题讨论】:

    标签: c++ pyqt


    【解决方案1】:

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

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

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

    类似的,

    lib.game_init(handle)
    

    【讨论】:

      【解决方案2】:

      我有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__())
      

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-01-11
          • 1970-01-01
          • 1970-01-01
          • 2013-01-11
          • 2023-03-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多