【问题标题】:Is it possible to embed C++ widget to PyQt application?是否可以将 C++ 小部件嵌入到 PyQt 应用程序中?
【发布时间】:2017-10-30 17:25:29
【问题描述】:

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

有可能吗?

【问题讨论】:

    标签: python c++ pyqt pyqt5


    【解决方案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
    

    ma​​in.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 很少。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-19
      • 2023-04-03
      • 2011-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-15
      相关资源
      最近更新 更多