目录:
1.从Qt中调用py脚本里的一个无参函数,功能:打印"hello python"
a)相关配置
b)踩过的一些坑
2.从Qt中调用py脚本里的一个有参函数并接收返回值 ,功能:实现 return a+b
正文:
1.首先在Qt中创建一个Qt Widgets Application(当然其他的也行)
我电脑里面的是python35,64位的,所以要用64位去编译它,不然会出错。
这里我用的是
2.然后在项目中添加一个python文件
最后结构目录如下:
修改python和c++文件
#!/usr/bin/env python # -*- coding: utf-8 -*- #coding=UTF8 def hello(): print("Hello Python")
修改mian.cpp
#include "mainwindow.h" #include <QApplication> #include <Python.h> #include <QDebug> int main(int argc, char *argv[]) { QApplication a(argc, argv); // MainWindow w; // w.show(); Py_Initialize();//初始化py模块 if ( !Py_IsInitialized() ) { return -1; } PyRun_SimpleString("import sys");//设置py脚本的路径 PyRun_SimpleString("sys.path.append(‘./‘)");//当前路径 PyObject* pModule = PyImport_ImportModule("test_py"); // 这里的test_py就是创建的python文件 if (!pModule) { qDebug()<< "Cant open python file!\n"; return -1; } PyObject* pFunhello= PyObject_GetAttrString(pModule,"func2"); // 这里的hello就是python文件定义的函数 if(!pFunhello){ qDebug()<<"Get function hello failed"; return -1; } PyObject_CallFunction(pFunhello,nullptr);//调用hello函数 Py_Finalize();//释放py模块 return a.exec();
3.运行程序
qmake 然后构建 最后运行
错误1:找不到 python.h
出错原因:我们在qt中调用了Python.h,但是没有添加python的相应动态链接库
解决办法:在.pro工程文件中添加相应的头文件和库文件
INCLUDEPATH += D:/Python/include
LIBS += -LD:/Python/libs/
-l_tkinter/
-lpython3/
-lpython35
注意:1)这路径是你自己电脑里装python的文件路径
2)-L 和-l(这里是小写的L)后面直接跟路径和文件名,不能有空格,不然会报错,LNK1146: 没有用选项“/LIBPATH:”指定的参数
错误2: error: C2238: 意外的标记位于“;”之前
出现原因:由于QT中定义了slots作为关键了,而python3中有使用slot作为变量,所以有冲突
解决方法:在python的object.h中 slots冲突,因此修改object.h,我的object.h路径:D:\Python\include\object.h
然后保存qmake 构建 运行
出现错误: error: LNK1104: 无法打开文件“python35_d.lib
问题: 无法打开 python36_d.lib 的问题
解决: Anaconda3 的 pyconfig.h 文件中做出修改。 我的pyconfig.h路径:D:\Python\include\pyconfig.h
将315行的,python36_d.lib
改成python36.lib
同时注释359行
噢,对了,因为我在前面设置加载py是 ‘‘./‘‘所以是在当前文件夹下面
需要在项目中取消Shadow bulid的勾选,让debug文件在当前文件夹下,养成这个好习惯,不然以后老是会出现找不到xxxx而出错
OK,然后在qmake 编译 运行
在Qt中调用python,读取csv文件,实现K近邻算法(一)
原文:https://www.cnblogs.com/Laohou/p/10635773.html