qt调用python脚本详细

首先要确保qt和python位数匹配,本人因为位数不同多花了一天的时间查问题结果发现是位数不同。

环境:win10  python3.8(64位)  qt5.12.10(64位

1. 新建一个QT项目

2. 在.pro文件中加入需要的python库文件目录

打开.pro文件,右键选择添加库→外部库→浏览库文件→选择python38.lib

qt调用python脚本详细_第1张图片

 qt调用python脚本详细_第2张图片

 注意红色方框位置不要选错

 qt调用python脚本详细_第3张图片

将导入的语句的最后一行删掉

qt调用python脚本详细_第4张图片

3. 修改object.h文件

 我的路径是 D:\ThePaK\Python3.8\include

添加红框中的代码

qt调用python脚本详细_第5张图片

执行新创建的QT项目,生成debug文件,将要执行的python脚本放在debug文件夹中

 qt调用python脚本详细_第6张图片

Py_Module.py

def prin():
    return "hello"
def add(a,b):
    return a+b

 mainwindow.h文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include "D:\ThePaK\Python3.8\include\Python.h"

#include
#include

#include 

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //Py_SetPythonHome((const wchar_t *)(L"D:/ThePaK/Python3.8"));
    Py_Initialize();
    if( !Py_IsInitialized() )
        qDebug()<<"初始化失败";
        //导入sys模块设置模块地址
    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path.append('./')");
    //QString setSysPath = QString("sys.path.append('%1')").arg(QCoreApplication::applicationDirPath());
    //PyRun_SimpleString(setSysPath.toStdString().c_str());
    //创建模块指针
    PyObject* pModule = PyImport_ImportModule("Py_Module");
    if (!pModule)
        qDebug()<<"获取模块指针失败";
    //创建函数指针
    PyObject* pFunc= PyObject_GetAttrString(pModule,"add");
    PyObject* pFunc2= PyObject_GetAttrString(pModule,"prin");
    if(!pFunc)
        qDebug()<<"获取函数指针1失败";
    if(!pFunc2)
        qDebug()<<"获取函数指针2失败";
    //无参函数
    PyObject* pPara2 = PyObject_CallFunction(pFunc2, 0);
    char* res3;
    PyArg_Parse(pPara2, "s", &res3);
    qDebug()<<"print(f):"<

有问题欢迎交流~

你可能感兴趣的:(qt,开发语言,python,c++)