一、開發環境
Qt5.12.0
Python3.7.8 64bit
二、使用
新建一個Qt項目,右擊項目名稱,選擇“添加庫”
選擇“外部庫”,點擊“下一步”
點擊“瀏覽”,選擇Python安裝目錄下的libs文件夾中的“python37.lib”文件,點擊“下一步”
點擊“完成”
.pro文件中出現如下代碼,刪除掉紅框中37之后的“d”(此處刪除d是因為在Python安裝目錄下的libs文件夾中只有python37.lib,沒有python37d.lib)
再手動添加上第43和44行代碼
右擊項目,選擇“構建”
構建完成后,在構建目錄下創建一個py文件
在py文件中自定義一個簡單的加法函數
def AddFunc(a, b):print("AddFunc: ")print("{} + {} = {}".format(a, b, a+b))return a + b
回到Qt中,更改main.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();// return a.exec();//初始化python解釋器Py_Initialize();if (!Py_IsInitialized()){qDebug()<<"init failed!";return 0;}//初始化python系統文件路徑,保證可以訪問到 .py文件
// PyRun_SimpleString("import sys");
// PyRun_SimpleString("sys.path.append('./')");//調用python文件名。當前的測試python文件名是 pyFile.pyPyObject* pModule = NULL;pModule = PyImport_ImportModule("pyFile");if (!pModule){qDebug()<< "open python file failed!";return 0;}//調用函數,函數名AddFuncPyObject* pFunc = NULL;pFunc = PyObject_GetAttrString(pModule, "AddFunc");if(!pFunc){qDebug() << "get function failed!";return 0;}//給python傳參數// 函數調用的參數傳遞均是以元組的形式打包的,2表示參數個數PyObject* pArgs = PyTuple_New(2);//第一個參數,傳入 int 類型的值 2PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 2));//第二個參數,傳入 int 類型的值 4PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 4));//使用C++的python接口調用該函數PyObject* pReturn = PyObject_CallObject(pFunc, pArgs);//接收python計算好的返回值int value;// i表示轉換成int型變量。// 在這里,最需要注意的是:PyArg_Parse的最后一個參數,必須加上“&”符號PyArg_Parse(pReturn, "i", &value);qDebug() << "result is " << value;//8、結束python接口初始化Py_Finalize();
}
Crtl+R,運行程序。在程序的問題窗口出現如下錯誤提示,雙擊錯誤提示,打開“object.h”文件
?在錯誤提示代碼的前后加上如下代碼
再次運行程序,程序輸出框中出現如下內容,表示調用成功。
- 如果程序輸出框中輸出“open python file failed!”,查看自己創建的py文件是否和Qt程序生成的可執行文件exe在同一個文件夾中或者py文件中的代碼是否編寫正確;
- 如果程序輸出框中輸出“get function failed!”,查看Qt中調用的py文件中的函數名與實際py文件中的函數名是否一致;
- 如果程序輸出框輸出“程序異常結束”,查看是否配置了Python的環境變量: