是否可以将 C++ 小部件嵌入到 PyQt 应用程序中?
Posted
技术标签:
【中文标题】是否可以将 C++ 小部件嵌入到 PyQt 应用程序中?【英文标题】:Is it possible to embed C++ widget to PyQt application? 【发布时间】:2017-05-30 09:45:00 【问题描述】:我有一个 PyQt5 应用程序和大多数用 Python 编写的小部件。我想在 C++ Qt 中编写一些小部件以使其更快,然后将其嵌入到我的 PyQt QMainWindow 中。
有可能吗?
【问题讨论】:
【参考方案1】:您可以使用 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
%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_())
输出:
【讨论】:
感谢您的回复。我正在尝试构建它,但它失败了。 python3 configure.py 通过,但是make
step 说找不到库 MyLabel
我已经重新加载了项目。现在make
步骤通过了,但是当我尝试运行Examples.main.py
时,它给出了一个错误:ImportError: libMyLabel.so.1: cannot open shared object file: No such file or directory
很好,它有效。我会尝试在 Windows 下构建它(使用 nmake)。
感谢您的广泛回答。自从您发布它以来,SIP 已经发生了一些变化,并且最新版本似乎不再适用于您的代码。您是否计划对您的存储库进行任何更新?【参考方案2】:
您可以使用SIP 为您的C++
代码创建绑定,就像创建PyQt
绑定一样。
但是,SIP 生成的绑定本身就是C++
代码,在PyQt
的情况下直接链接到Qt
二进制文件。如果您只是打算将PyQt
代码重写为C++
,那么实现的任何加速都将是微不足道的,因为一开始执行的本机python 很少。
【讨论】:
以上是关于是否可以将 C++ 小部件嵌入到 PyQt 应用程序中?的主要内容,如果未能解决你的问题,请参考以下文章
将 Matplotlib 图形嵌入到小部件中 - PyQt5
如何在 PyQt4 小部件中嵌入的 Axes3D (matplotlib) 中启用旋转?