Qt調(diào)用Python詳細圖文過程記錄
1、創(chuàng)建Qt工程

2、添加Python文件

編寫Python代碼,項目結(jié)構(gòu)如下圖示:

3 、添加Python庫
在工程文件中加上Python安裝路徑下的??include???和??libs??路徑:

INCLUDEPATH += C:\Users\Administrator\AppData\Local\Programs\Python\Python37\include LIBS += -LC:\Users\Administrator\AppData\Local\Programs\Python\Python37\libs -lpython37 //注意:-L 和 PATH 之間不能有空格
注意:此處必須根據(jù)自己的安裝情況做修改

4、調(diào)用Python模塊
#ifndef
#define
#include <QMainWindow>
#include <Python.h>
#include <iostream>
#include <QDebug>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
};
#endif// MAINWINDOW_H#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
//Python初始化
Py_Initialize();
if( !Py_IsInitialized() )
qDebug()<<"初始化失敗";
//導(dǎo)入sys模塊設(shè)置模塊地址
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());
//創(chuàng)建模塊指針
PyObject* pModule = PyImport_ImportModule("Py_Module");
if (!pModule)
qDebug()<<"獲取模塊指針失敗";
//創(chuàng)建函數(shù)指針
PyObject* pFunc= PyObject_GetAttrString(pModule,"add");
if(!pFunc)
qDebug()<<"獲取函數(shù)指針失敗";
//創(chuàng)建函數(shù)參數(shù),方法1
PyObject* pPara = PyTuple_New(2); // 2個參數(shù)
PyTuple_SetItem(pPara, 0, Py_BuildValue("i",1)); //參數(shù)1為int型 1
PyTuple_SetItem(pPara, 1, Py_BuildValue("i",2)); //參數(shù)2為int型 2
//pPara = Py_BuildValue("(i,i)",1,2); //連寫方式
/*
PyObject* pPara = PyTuple_New(2); // 2個參數(shù)
PyTuple_SetItem(pPara, 0, Py_BuildValue("s","Hello")); //參數(shù)1為String型 "Hello"
PyTuple_SetItem(pPara, 1, Py_BuildValue("s","World!")); //參數(shù)2為String型 "World!"
*/
/// s 將C字符串轉(zhuǎn)換成Python對象,如果C字符串為空,返回NONE
/// c 將C類型的char轉(zhuǎn)換成長度為1的Python字符串對象
/// i 將一個C類型的int轉(zhuǎn)換成Python int對象
/// l 將C類型的long轉(zhuǎn)換成Pyhon中的int對象
/// f 將C類型的float轉(zhuǎn)換成python中的浮點型對象
/// d 將C類型的double轉(zhuǎn)換成python中的浮點型對象
//創(chuàng)建函數(shù)參數(shù),方法2
PyObject* args = PyTuple_New(2); // 2個參數(shù)
PyObject* arg1 = PyLong_FromLong(4); // 參數(shù)一設(shè)為4
PyObject* arg2 = PyLong_FromLong(3); // 參數(shù)二設(shè)為3
PyTuple_SetItem(args, 0, arg1);
PyTuple_SetItem(args, 1, arg2);
//調(diào)用Python函數(shù),傳入元組參數(shù)pPara
PyObject *FuncBack = PyObject_CallObject(pFunc,pPara);
//PyObject_CallObject(pFunc,nullptr); //無參數(shù)調(diào)用
//FuncBack是返回值指針,轉(zhuǎn)換獲取返回值
int res = 0;
PyArg_Parse(FuncBack,"i",&res);
qDebug()<<"返回值: "<<res;
//調(diào)用結(jié)束,銷毀
Py_Finalize();
}
MainWindow::~MainWindow()
{
delete ui;
}5、移動文件
編寫完上述代碼之后,直接運行,會得到:
獲取模塊指針失敗
要保證Qt可執(zhí)行文件與Python源文件在同一級目錄下,方可正常運行
所以將工程下的??Py_Module.py???復(fù)制到構(gòu)建目錄下的??debug??文件夾中:

6、運行結(jié)果

7、錯誤總結(jié)及解決辦法
錯誤1:找不到??Python.h??
出現(xiàn)原因: 因為我們在c++中使用這個了頭文件,因此出現(xiàn)了找不到python.h
解決辦法: 在.pro文件中添加python的頭文件以及靜態(tài)鏈接庫,參考:3 、添加Python庫
錯誤2:
PyType_Slot *slots; object.h(445) : error C2059: 語法錯誤:“;” object.h(445) : error C2238: 意外的標記位于“;”之前
解決辦法:把slots改成slots1,Python將slots作為變量,而Qt將slots作為關(guān)鍵字,所以沖突了,再次編譯該問題就沒有了
錯誤3:
解決辦法:簡單粗暴,直接注釋掉
總結(jié)
到此這篇關(guān)于Qt調(diào)用Python的文章就介紹到這了,更多相關(guān)Qt調(diào)用Python內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用python實現(xiàn)正則匹配檢索遠端FTP目錄下的文件
這篇文章主要介紹了使用python實現(xiàn)正則匹配檢索遠端FTP目錄下的文件的方法,非常的簡單實用,需要的小伙伴參考下2015-03-03
Python利用psutil庫進行監(jiān)控進程和資源
psutil是Python系統(tǒng)和進程工具庫,它提供了一種跨平臺的方式來獲取系統(tǒng)信息、管理系統(tǒng)進程、監(jiān)控系統(tǒng)性能、操作系統(tǒng)資源等,下面就跟隨小編一起來學習psutil庫的具體應(yīng)用吧2024-01-01
Windows和夜神模擬器上抓包程序mitmproxy的安裝使用詳解
mitmproxy是一個支持HTTP和HTTPS的抓包程序,有類似Fiddler、Charles的功能,只不過它是一個控制臺的形式操作,這篇文章主要介紹了Windows和夜神模擬器上抓包程序mitmproxy的安裝使用詳解,需要的朋友可以參考下2022-10-10
使用PyInstaller將python轉(zhuǎn)成可執(zhí)行文件exe筆記
這篇文章主要介紹了使用PyInstaller將python轉(zhuǎn)成可執(zhí)行文件exe筆記,需要的朋友可以參考下2018-05-05
總結(jié)網(wǎng)絡(luò)IO模型與select模型的Python實例講解
同步、異步、阻塞、非阻塞,當這些網(wǎng)絡(luò)IO名詞堆到一起時難免使編程初學者感到困惑,這里我們就來為大家總結(jié)網(wǎng)絡(luò)IO模型與select模型的Python實例講解:2016-06-06
python+selenium實現(xiàn)QQ郵箱自動發(fā)送功能
這篇文章主要為大家詳細介紹了python+selenium實現(xiàn)QQ郵箱自動發(fā)送功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-01-01

