Qt调用Python脚本Windows完整版(包含遇到的问题)
一、前言
由于Python用的越来越广泛,很多功能也有了其他语言不可替代性,因此在Qt中如何调用Python代码呢。。。。经过亲身经历给大家一片完整的讲解(其中包含了几个我遇到的问题)希望对大家有所帮助。
二、工具准备
1.我认为任何Qt版本都是一样的处理方法。
2.我使用的是Python3.7.2(当前最新版),对于Python2会不会有其他问题不敢保证(你得知道自己Python的根目录,可以在终端中输入where python
即可知道自己Python的位置,ps:打开终端的方法(这个还要讲的话。。好吧)WIN + R
输入cmd
。
三、打开Qt新建一个随便什么样的工程(假设是mainwindow类)
1.我们打开—(.pro)文件在最下面输入如下代码
INCLUDEPATH += D:/python3.7/include
LIBS += D:/python3.7/libs/python37.lib
(解释一下D:/python3.7是我python的根目录在根目录连有include和libs两个文件夹,具体根据你自己的文件夹进行修改)
2.此时编译一下,你会发现有两个错误:
错误1:
PyType_Slot *slots; object.h(445) : error C2059: 语法错误:“;”
object.h(445) : error C2238: 意外的标记位于“;”之前
解决方法:把slots改成slots1,我认为是和Qt自带的slots函数冲突导致的。再次编译该问题没了
错误2:
解决方法:我直接注释掉 hhhh;(//)
3.咋们不是要运行Python脚本吗?所以我们创建一个脚本;想必你是有Python基础的。我们直接创建一个文本文件改名为hello 后缀改为py就变成了一个python程序,在里面输入简单的如下代码:
def hello():
print("hello ya")
最关键的来了:要想在Qt中找到这个文件你必须要把他放在debug目录下也就是找到你的工程中你的项目自动生成的一个MingGW-DeBug(名字最长的那玩意)然后进入debug目录,把你的脚本放在里面。很坑hhh,不过没办法。
3.在main.cpp添加如下代码:(注释已写,自己理解)最关键的是hello这个文件名和方法名
#include "mainwindow.h"
#include <QApplication>
#include <Python.h>
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Py_Initialize();
if( !Py_IsInitialized() ){
return 0;
}
//执行单句Python语句,用于给出调用模块的路径,否则将无法找到相应的调用模块
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./')");
//获取qt_python_fun.py模块的指针
PyObject* pModule = PyImport_ImportModule("hello");//**最重要**
if (! pModule){
qDebug()<<QObject::tr("Can't open python file\n");
return 0;
}
//获取hello函数的指针
PyObject* pFunHandler = PyObject_GetAttrString(pModule,"hello");//**最重要**
if (!pFunHandler){
qDebug()<<QObject::tr("Get function hello failed\n");
return 0;
}
//调用函数,传入参数为NULL
PyObject_CallFunction(pFunHandler,NULL);
//销毁Python解释器,这是调用的最后一步
Py_Finalize();
return a.exec();
}
好了也差不多了,最后编辑跑一下,你会发现你成功了。
之后添加文件就自己发挥吧!!!