首页 > 编程知识 正文

qt调用python的部分问题(Python调用qt)

时间:2023-12-06 11:46:56 阅读:312454 作者:CADJ

本文目录一览:

  • 1、用C++/Qt 写Python调试器遇到的问题
  • 2、QT中调用Python
  • 3、在qt程序中怎么运行一个python程序
  • 4、Qt下无法调用python,打不开文件为什么
  • 5、linux下用qt需要用到python在Py_Initialize就报错

用C++/Qt 写Python调试器遇到的问题

在C++中,“类函数指针”和传统的“函数指针”,是两个完全不同的东西。

你取一个类的成员函数的地址,得到的是一个类函数指针,也叫成员函数指针。即使你的成员函数定义看起来和普通函数原型完全一样,它也和这个原型的普通函数指针完全不同,彼此之间不能转换。

PyEval_SetTrace要求传入的是一个传统的函数指针,你传入一个类函数指针,当然是不行的。编译器报错是说无法将一个类函数指针转换为函数指针。

C++的类函数指针,是一个非常难用的东西,有非常多奇怪的特性,而且不同编译器对它的支持大不相同,是C++著名的复杂性来源之一,建议不要使用。

你想要的东西,实际上是一个“委托”的概念,不过可惜的是C++并不支持委托。使用boost::function可以实现类似功能,但python的C API接口却不支持boost::function,所以也不行。

你这种情况,最简单的方法还是用传统的函数指针,使用普通函数包装下类的成员函数,然后把普通函数的指针传给python。

QT中调用Python

如果你是嵌入的话,应该没问题。python的库会暴露c api的,你的qt程序照着python文档中的embedded章节就好。 看样子,你的是linux下的,不过一般头文件就是include/python.h,怎么会是include/python2.7呢?你写错了吧。库文件应该是在lib下面。

在qt程序中怎么运行一个python程序

因为process.start()函数实质是采用命令行中"start XXX"的方式启动XXX。这里的XXX仅仅适用于大部分的exe可执行文件以及一些常用文件。对于py或者pyw文件都不行。

有两种解决方案:

另外编写一个bat用来启动py文件,就可以使用start启动这个bat就可以了;

使用另一个函数“QDesktopServices::openUrl”来启动py文件。具体使用方法请自行百度。不做过多说明。

Qt下无法调用python,打不开文件为什么

#include QCoreApplication

//包含调用Python相应的头文件

#include Python.h

int main(int argc, char *argv[])

{

 QCoreApplication a(argc, argv);

//初始化Python解释器,这是调用操作的第一步

 Py_Initialize();

 if( !Py_IsInitialized() ){

 return -1;

 }

//执行单句Python语句,用于给出调用模块的路径,否则将无法找到相应的调用模块

 PyRun_SimpleString("import sys");

 PyRun_SimpleString("sys.path.append('./')");

//获取qt_python_fun.py模块的指针

 PyObject* pModule = PyImport_ImportModule("qt_python_fun");

 if (! pModule){

 printf("Can't open python filen");

 return -1;

 }

//获取hello函数的指针

 PyObject* pFunhello = PyObject_GetAttrString(pModule,"hello");

 if (!pFunhello){

 printf("Get function hello failedn");

 return -1;

 }

//调用函数,传入参数为NULL

 PyObject_CallFunction(pFunhello,NULL);

//销毁Python解释器,这是调用的最后一步

 Py_Finalize();

 return a.exec();

}

作者:sleepyjoker

链接:

来源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

linux下用qt需要用到python在Py_Initialize就报错

你在链接的时候必须提供正确的链接参数 (需要把 libpython 链接到你的可执行程序才能正确找到python C API)

具体可以用

pythonX.Y-config --cflags

得到编译参数。

pythonX.Y-config --ldflags

得到链接参数

比如在我的系统上python2.7得到的参数是

$ python2.7-config --cflags

-I/usr/include/python2.7 -I/usr/include/python2.7 -fno-strict-aliasing -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong --param=ssp-buffer-size=4 -DNDEBUG -march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong --param=ssp-buffer-size=4

$ python2.7-config --ldflags

-lpython2.7 -lpthread -ldl -lutil -lm -Xlinker -export-dynami

那么就在编译和链接的时候分别加入上面列出的参数,就可以了 (注意,不要加我例子中打印出来的内容,要加你自己执行pythonX.Y-config 后得到的内容)。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。