有没有可能将C++小部件嵌入PyQt应用程序?

5

我有一个使用PyQt5编写的应用程序,大部分小部件都是用Python编写的。我想使用C++ Qt编写一些小部件以加快速度,并将其嵌入到我的PyQt QMainWindow中。

这种做法可行吗?

2个回答

12
你可以使用SIP,以便从Python中执行由C++ 创建的小部件,在下面的链接中我展示了如何做到这一点:link 示例的结构如下:
├── configure.py
├── sip
│   ├── AnalogClock.sip
│   └── PyAnalogClock.sip
└── src
    ├── analogclock.cpp
    ├── analogclock.h
    ├── analogclockl_global.h
    └── AnalogClock.pro

在src文件夹中,您必须创建小部件库。

在sip文件夹中,您必须放置要公开的类的结构:

AnalogClock.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

的翻译是:

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中进行了测试)。

然后通过执行以下命令进行编译:

python configure.py
make 
sudo make install

执行上述操作后,会生成一个名为"modules"的文件夹,其中包含动态库文件,在本例中为PyAnalogClock.so。我们需要将这个文件放在源代码文件夹中。

.
├── main.py
└── PyAnalogClock.so

main.py

=>

主程序.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_())

输出:

在此输入图片描述


谢谢您的回复。我正在尝试构建它,但是失败了。 Python3 configure.py 通过了,但“make”步骤显示找不到库MyLabel。 - Felix
我已经重新加载了项目。现在make步骤通过了,但是当我尝试运行Examples.main.py时,它会出现错误:ImportError: libMyLabel.so.1:无法打开共享对象文件:没有那个文件或目录。 - Felix
太好了,它可以工作。我会尝试在Windows下构建它(使用nmake)。 - Felix
感谢您的详细回答。自您发布之后,SIP已经发生了一些变化,最新版本似乎不再与您的代码兼容。您是否计划更新您的代码库? - Cerno

3
您可以使用SIP为您的C++代码创建绑定,就像PyQt绑定一样。
但是,由SIP生成的绑定本身是C++代码,在PyQt的情况下,它们直接链接到Qt二进制文件中。如果您只是打算将PyQt代码重写为C++,那么实现的任何加速都将是微不足道的,因为首先几乎没有执行本地python代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接