Python对Qt d的支持

2024-06-16 11:38:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我有自己的C++库项目(带有源代码),用Qt编写,它使用^ {CD1>},^ {< CD2>},^ {CD3>}信号和槽。在

我也希望用Python支持这个库。在

最好的方法是什么?在

  • 用Python编写包装器,如果是这样的话会有障碍吗?在
  • 不知道PyQt是否只是为了这个目的?在
  • 或者你是否只是通过在C++库项目中使用逻辑来更好地重写Python中的LIB。在

因为这个库是SDK的一部分,所以事实上也同样适用于用.NET支持QT-dll,这是在支持Python之后的第二步。在

Qt的示例API。在

quint16 SendCommandAsync(CmdBaseSpv1* pcommand,
                         ConnectionArg connectionArg,
                         emitLogOptions::emitLogOption logOption,
                         LogInfo &txLogInfo,
                         LogInfo &rxLogInfo);

我想从Python调用这个函数。 函数参数CmdBaseSpv1ConnectionArgemitLogOptionLogInfo都是Qt类。 其中一些参数正在使用QOBJECT基类。在

从函数名可以看出,这是一个异步函数调用。结果将发出一个信号,所以我也需要得到异步结果。在


Tags: 项目方法函数源代码信号qtpyqt障碍
1条回答
网友
1楼 · 发布于 2024-06-16 11:38:00
<>我将写下我对包装C++库所知道的内容,并试图将其导出,但是作为<强>大免责声明< /强>,我只对自己使用了非常简单的东西。在

您会询问如何用Python重写库。我想这要看情况而定。如果代码很琐碎,那么我不知道为什么不。如果它更大,并且必须与其他代码保持最新(正如你在.Net中所暗示的那样),我就不会这样做了。在

我的建议

从我看到的代码来看,我会尝试使用boost::pythonSWIG来包装它。在

如何包装

主要的问题是在Python中创建CmdBaseSpv1ConnectionArg等。在

如果不需要任何Qt类来实例化类,这应该很简单。但是,如果您需要Python内部的Qt类型(例如,因为CmdBaseSpv1的构造函数需要QString),那么您的任务就复杂得多,因为您需要一种将Python字符串转换为QString的方法。如果可以,您应该只使用stl-类型。在

Python中的所有内容

包装小型C库的最简单方法是使用cffi module(或ctypes)。您可以用Python编写完整的绑定。但是,如果API很大并且很难实现,则需要大量的手动操作。在

还有一个问题:cType是only compatible with C,不是C++。因此,你需要改变你的接口,以兼容C,在内部,你仍然可以使用C++和QT。在

用手包装

另一种方法是包装库调用您自己。您可以使用Python API来执行此操作。还有一些库可以帮助您创建绑定。{a7}似乎特别有前途,并且用C++来工作。在

捆绑发电机

如果你的API很大,你应该使用一个绑定生成器来解析C++代码并生成绑定本身。例如,sip就是其中之一。它用于为整个Qt库创建绑定。有一些绑定生成器,Python文档中提到的一个是SWIG。PySide使用了Shiboken,并且在他们的网站上有一个很好的描述。在

SWIG还有一个额外的优势,您可以为多种语言创建绑定,包括C。在

PyQt公司

PyQt是使用sip从Qt生成的绑定。您可能不需要它,除非您需要从Python内部访问Qt的全部功能。如果是这样,考虑使用sip来生成绑定,这样像信号槽机制这样的东西在库和PyQt之间是兼容的。在

绑定的挑战

绑定面临一些挑战,因为Python和C++在一些关键领域是不同的。在

内存管理

内存管理在Python中几乎是自动的,在C++中你需要手动完成。例如

def myfunc():
    mywidget = QWidget()

myfunc()结尾,mywidget得到垃圾回收。在C++中,但是

^{pr2}$

mywidget还在。这意味着即使在Python内部,也需要注意C++内存管理。我看到的问题是内存泄漏和指针悬空。使用回调时要注意这一点,你不想让Python垃圾回收回调,而C++认为它仍然活着。在

例外情况

并不是所有的编程语言都有异常或以相同的方式处理它们。例如,如果在Python中捕获到C++中的异常,那就太好了。在

相关问题链接

相关问题 更多 >