构建QT下的Python环境
在QT中,选择工具->选项->环境->外部工具,先添加目录,命名为RunPy,再在RunPy目录下添加工具Python3,设置执行档为C:\Users\32063\AppData\Local\Programs\Python\Python39\python.exe(即Python)的安装目录,设置参数为%{CurrentDocument:FilePath},工作目录为%{CurrentDocument:Path},如下图所示:
添加静态库
右击工程->添加库->选择外部库,设置库文件为C:\Users\32063\AppData\Local\Programs\Python\Python39\libs\python39.lib(根据自己的python路径选择),包含路径设置为C:\Users\32063\AppData\Local\Programs\Python\Python39\include,链接设置为静态,只勾选Windows,不要勾选为debug版本添加’d’作为后缀。如图所示:
遇到的坑
报错:error: expected unqualified-id before ‘;’ token,是因为python中的slots定义冲突了,需要重定义slots
添加静态库时,在pro文件里面,对于添加静态库后所添加的代码内容,只保留以下部分,剩下删掉
unix:!macx|win32: LIBS += -LC:/Users/32063/AppData/Local/Programs/Python/Python39/libs/ -lpython39
INCLUDEPATH += C:/Users/32063/AppData/Local/Programs/Python/Python39/include
DEPENDPATH += C:/Users/32063/AppData/Local/Programs/Python/Python39/include
代码实现
#include <Python.h>
void MainWindow::RunPY()
{
Py_Initialize();
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.argv = ['python.py']");
PyRun_SimpleString("sys.path.append('./')");
PyObject* pModule = PyImport_ImportModule("main"); // 脚本文件的name,不能以text命名,否则会冲突
if (!pModule)
{
PyErr_Print();
std::exit(1);
qDebug()<<"Cant open python file!\n";
}
qDebug()<<"file of python ac been opened";
PyObject* pFunhello= PyObject_GetAttrString(pModule,"main");
if(!pFunhello){
qDebug()<<"Get function hello failed";
}
//调用temperImg函数
PyObject_CallFunction(pModule,NULL);
//结束,释放python
Py_Finalize();
qDebug()<<"end\n";
}
代码跑起来的坑
一、为了让代码跑起来,需要将python脚本文件跟QT的exe文件放在同一目录下,无论是debug版本还是release版本,都需要将python脚本和exe在同一目录。
二、python文件里面,需要指定其他文件或文件夹位置时,要使用绝对路径,相对路径会找不到,报错,不知原因,但想来应该能解决。
版权声明:本文为qq_46181090原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。