目錄:
1.從Qt中調用py腳本里的一個無參函數,功能:打印"hello python"
a)相關配置
b)踩過的一些坑
2.從Qt中調用py腳本里的一個有參函數並接收返回值 ,功能:實現 return a+b
正文:
1.首先在Qt中創建一個Qt Widgets Application(當然其他的也行)
我電腦里面的是python35,64位的,所以要用64位去編譯它,不然會出錯。
這里我用的是
2.然后在項目中添加一個python文件
最后結構目錄如下:
修改python和c++文件
#!/usr/bin/env python # -*- coding: utf-8 -*- #coding=UTF8 def hello(): print("Hello Python")
修改mian.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(); 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()<<"Get function hello failed"; return -1; } 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 編譯 運行