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封装一下,如果你定义了多态多了会有点麻烦。
这个装饰器很强大,第二位博主的示例中,可以作为一个类似类工厂的存在。
领悟不足,暂时记录,后续再补充