2017-05-30 5 views

答えて

1

SIPを使用すると、C++で作成されたウィジェットをPythonから次のように実行することができます。linkこれを行う方法の例を示します。次のように

例の構造は次のとおりです。

srcフォルダに
├── configure.py 
├── sip 
│   ├── AnalogClock.sip 
│   └── PyAnalogClock.sip 
└── src 
    ├── analogclock.cpp 
    ├── analogclock.h 
    ├── analogclockl_global.h 
    └── AnalogClock.pro 

あなたはあなたが公開するクラスの構造を配置する必要があり、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 

前のモジュールを実行するとモジュールと呼ばれるフォルダが生成され、その中には動的ライブラリがありますyは、例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_()) 

出力:

enter image description here

+0

返信いただきありがとうございます。私はそれを構築しようとしているが、失敗する。 python3 configure.pyは渡しますが、 'make'はライブラリMyLabelを見つけることができません。 – Felix

+0

あなたのOSは何ですか? – eyllanesc

+0

githubプロジェクト全体を完全にダウンロードしましたか? – eyllanesc

1

SIPを使用して、C++コードのバインディングを、PyQtバインディングと同じ方法で作成できます。

しかし、SIPによって生成されたバインディング自体はC++コードであり、PyQtの場合はQtバイナリに直接リンクされています。 PyQtコードをC++と書き換えるつもりなら、最初に実行されるネイティブのPythonがほとんどないため、実現されるスピードアップはごくわずかです。

関連する問題