QT使用PythonQt调用QT对象

1.PythonQt和PyQt4/PyQt5是两回事,但是很多搜索到的教程很难分开

2.谢谢这两位博主

PythonQt进阶  zhangzming,这个例子是没有继承QObject的做法

将Python嵌入到Qt程序中  openthings


我们要做什么

1.在qt中使用PythonQt

2.将qt中的对象添加到PythoQt中并调用


步骤

1.安装了PythonQt的库,linux ,



apt-cache search libpythonqt

下载其中的

libpythonqt-dev - Dynamic Python binding for the Qt framework - development
libpythonqt3.0 - Dynamic Python binding for the Qt framework - runtime

头文件在 /usr/include/PythonQt,注意: /usr/lib/libpythonqt.so文件存在,但是调用就会报错Segment,我用了下载的源文件编译的库,请查看之前的文章。

用自己的库文件添加引用


2.头文件中的引用

SOURCES += main.cpp \
    tt.cpp

INCLUDEPATH += /usr/include/python2.7/\
        /usr/include/PythonQt/\

#INCLUDEPATH += /usr/include/python3.5/\


#unix:!macx: LIBS += -lPythonQt

#unix:!macx: LIBS += -lpython3.5m

unix:!macx: LIBS += -lpython2.7

unix:!macx: LIBS += -L/home/kare/Documents/QtProg/PythonQt3.2/lib\
                -lPythonQt-Qt5-Python2.7


3.建立自己的包装类

#ifndef TT_DECORATORS_H
#define TT_DECORATORS_H
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

class PyExampleDecorators : public QObject
     {
         Q_OBJECT

     public slots:
         QVariant  new_QSize (const int  &p)
             { return QSize (p, p); }
         void showTime(ca* fml_ca,int a)
         {
             fml_ca->a=a;
             cout<a<

4.在其他类中调用

    PythonQt::init();
    PythonQt* pyqt=PythonQt::self();
    mainModule = pyqt->getMainModule();
    // connect output signals
        connect(pyqt, SIGNAL(pythonStdOut(const QString&)), this, SLOT(co(const QString&)));
        connect(pyqt, SIGNAL(pythonStdErr(const QString&)), this, SLOT(co(const QString&)));

        mainModule.evalScript("print 'py start'");

        ped=new PyExampleDecorators;
        pyqt->addDecorators(ped);
        pyqt->addObject(mainModule,"ped",ped);//注册,剩下直接调用就可以了
        mainModule.evalScript("from PythonQt import *\n"
                              "print 'moudle------------------------>',dir(ped)\n"
                              "a1=ped.new_ca()\n"
                              "print a1.showTime(123)\n"
                              "a2=ped.new_QSize(20)\n"
                              "print a2"
                              "");
        mainModule.evalScript("print 'completed'");

只能使用slots,自己定义的函数不可以调用,可以用slots封装一下,如果你定义了多态多了会有点麻烦。

这个装饰器很强大,第二位博主的示例中,可以作为一个类似类工厂的存在。

领悟不足,暂时记录,后续再补充

你可能感兴趣的:(python,qt)