我有一个PyQt5应用程序和大多数用Python编写的小部件。我想用C++ Qt写一些小部件,使它更快,然后将其嵌入到我的PyQt QMainWindow中。有可能吗?
9wbgstp71#
你可以使用SIP来执行一个用C++从Python创建的小部件,在下面的link中我展示了一个如何做到这一点的例子。示例的结构如下:
├── configure.py ├── sip │ ├── AnalogClock.sip │ └── PyAnalogClock.sip └── src ├── analogclock.cpp ├── analogclock.h ├── analogclockl_global.h └── AnalogClock.pro
在src文件夹中,您必须创建小部件库在sip文件夹中,您必须放置要公开的类的结构:
模拟时钟.sip
%Import QtGui/QtGuimod.sip %Import QtWidgets/QtWidgetsmod.sip %If (Qt_5_0_0 -) class AnalogClock : public QWidget{ %TypeHeaderCode #include "analogclock.h" %End public: AnalogClock(QWidget *parent /TransferThis/ = 0); protected: virtual void resizeEvent(QResizeEvent *); virtual void paintEvent(QPaintEvent *e); }; %End
PyAnalogClock.sip
%Module(name=PyAnalogClock, call_super_init=True, keyword_arguments="Optional") %DefaultMetatype PyQt5.QtCore.pyqtWrapperType %DefaultSupertype sip.simplewrapper %Include AnalogClock.sip
configure.py是配置项目编译的脚本,如果你有任何问题,你必须修改一些路径(它已经在Linux中测试过)然后通过执行以下命令编译它:
configure.py
python configure.py make sudo make install
当执行前一个时,它会生成一个名为modules的文件夹,其中是动态库,在示例PyAnalogClock.so的情况下,我们将此文件放置在源代码的文件夹中:
PyAnalogClock.so
. ├── main.py └── PyAnalogClock.so
main.py
from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import * from PyAnalogClock import AnalogClock if __name__=="__main__": import sys a=QApplication(sys.argv) w=AnalogClock() w.show() sys.exit(a.exec_())
产出:
cyvaqqii2#
您可以使用SIP为C++代码创建绑定,方法与创建PyQt绑定的方法相同。然而,SIP生成的绑定本身就是C++代码,在PyQt的情况下,直接链接到Qt二进制文件。如果你只是打算将PyQt代码重写为C++,那么实现的任何加速都可以忽略不计,因为首先执行的本地python很少。
C++
PyQt
Qt
2条答案
按热度按时间9wbgstp71#
你可以使用SIP来执行一个用C++从Python创建的小部件,在下面的link中我展示了一个如何做到这一点的例子。
示例的结构如下:
在src文件夹中,您必须创建小部件库
在sip文件夹中,您必须放置要公开的类的结构:
模拟时钟.sip
PyAnalogClock.sip
configure.py
是配置项目编译的脚本,如果你有任何问题,你必须修改一些路径(它已经在Linux中测试过)然后通过执行以下命令编译它:
当执行前一个时,它会生成一个名为modules的文件夹,其中是动态库,在示例
PyAnalogClock.so
的情况下,我们将此文件放置在源代码的文件夹中:main.py
产出:
cyvaqqii2#
您可以使用SIP为
C++
代码创建绑定,方法与创建PyQt
绑定的方法相同。然而,SIP生成的绑定本身就是
C++
代码,在PyQt
的情况下,直接链接到Qt
二进制文件。如果你只是打算将PyQt
代码重写为C++
,那么实现的任何加速都可以忽略不计,因为首先执行的本地python很少。