目录:
1.从Qt中调用py脚本里的一个无参函数,功能:打印"hello python"
a)相关配置
b)踩过的一些坑
正文:
1.首先在Qt中创建一个Qt Widgets Application(当然其他的也行)
我电脑里面的是python35,64位的,所以要用64位去编译它,不然会出错。
这里我用的是
2.然后在项目中添加一个python文件
最后结构目录如下:
修改python和c++文件
#!/usr/bin/env python#-*- coding: utf-8 -*-#coding=UTF8
defhello():print("Hello Python")
修改mian.cpp
#include "mainwindow.h"#include #include #include
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()<
}
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 编译 运行