是否可以将 C++ 小部件嵌入到 PyQt 应用程序中?

问题描述 投票:0回答:3

我有一个 PyQt5 应用程序和大多数用 Python 编写的小部件。我想用 C++ Qt 编写一些小部件以使其更快,然后将其嵌入到我的 PyQt QMainWindow 中。

可以吗?

python c++ pyqt pyqt5
3个回答
12
投票

您可以使用 SIP 来执行 Python 中用 C ++ 创建的小部件,在下面的链接中我展示了如何执行此操作的示例。

示例结构如下:

├── 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下测试过了)

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

python configure.py
make 
sudo make install

执行前一个时会生成一个名为modules的文件夹,里面是动态库,在示例

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_())

输出:


3
投票

您可以使用 SIP 为您的

C++
代码创建绑定,就像创建
PyQt
绑定一样。

但是,SIP 生成的绑定本身就是

C++
代码,并且在
PyQt
的情况下直接链接到
Qt
二进制文件。如果您只是打算将
PyQt
代码重写为
C++
,那么实现的任何加速都可以忽略不计,因为首先执行的本机 python 非常少。


0
投票

这里是使用 sip 和 CMake 的自定义 Cpp Qt 小部件的 Python 绑定的另一个示例(而不是 @eyllanesc 解决方案的 python sip-build 脚本)。

© www.soinside.com 2019 - 2024. All rights reserved.