QT應用(12)-QT調用python


功能:用qtcreator調用python文件。
1.環境:win10       64 位
           python3.8 64位
           mingw      64位
 位數一定要匹配,如果是64位,全部為64位。包括環境變量中的設定值。
2.pro 配置
    路徑選擇 自己盤上的安裝路徑

win32:CONFIG(release, debug|release): LIBS += -L$$PWD/../../ProgramData/Python/Python38/libs/ -lpython38
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/../../ProgramData/Python/Python38/libs/ -lpython38_d

INCLUDEPATH += $$PWD/../../ProgramData/Python/Python38/libs
DEPENDPATH += $$PWD/../../ProgramData/Python/Python38/libs
INCLUDEPATH += $$PWD/../../ProgramData/Python/Python38/include
DEPENDPATH += $$PWD/../../ProgramData/Python/Python38/include

#win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/../../ProgramData/Python/Python38/libs/libpython38.a
#else:win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/../../ProgramData/Python/Python38/libs/libpython38d.a
win32:!win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$PWD/../../ProgramData/Python/Python38/libs/python38.lib
else:win32:!win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$PWD/../../ProgramData/Python/Python38/libs/python38_d.lib

3.main.cpp

 1 #include "qtpyprj.h"
 2 
 3 #include <QApplication>
 4 #include <Python.h>
 5 #include<QDebug>
 6 #include<QString>
 7 
 8 int main(int argc, char *argv[])
 9 {
10     QApplication a(argc, argv);
11     qDebug()<<"run";
12     //設置了環境變量
13     Py_SetPythonHome((const wchar_t *)(L"D:/ProgramData/Python/Python38"));
14        //1.初始化Python解釋器
15      Py_Initialize();
16      if(!Py_IsInitialized())
17      {
18           qDebug()<<"無法初始化Python解釋器";
19            return -1;
20       }
21      //2.導入文件模塊  py文件路徑的問題
22      PyObject * pModule = PyImport_ImportModule("qtpyprj");          //pModule 調用的文件名,沒有后綴
23      if (!pModule)
24      {
25             qDebug()<<"無法導入qtpyprj模塊";
26             return -1;
27      }
28 
29      //3.調用函數無參的
30      PyObject * pFunc_run = PyObject_GetAttrString(pModule, "run"); //pFunc 調用的函數名
31      if (!pFunc_run || !PyCallable_Check(pFunc_run))
32      {
33           qDebug()<<"無法從qtpyprj模塊中加載run函數";
34           return -1;
35      }
36      PyEval_CallObject(pFunc_run, NULL);
37 
38      /*qDebug()<<"開始調用add ";
39      PyObject * pFunc_add = PyObject_GetAttrString(pModule, "add"); //pFunc 調用的函數名
40      if (!pFunc_add || !PyCallable_Check(pFunc_add))
41      {
42         qDebug()<<"無法從qtpyprj模塊中加載add函數";
43         return -1;
44      }
45 
46         //4. 函數調用是有兩種,一種傳參數的,一種不傳參數的。
47         //傳參數有兩種方法:
48         //4.1.1創建方法1
49          PyObject *arg3 =PyTuple_New(2);
50          PyObject *arg1 = PyLong_FromLong(1050);
51          PyObject *arg2 = PyLong_FromLong(520);
52 
53          PyTuple_SetItem(arg3,0,arg1);
54          PyTuple_SetItem(arg3,1,arg2);
55 
56          //4.1.2創建方法2
57       //   PyObject *args3 =Py_BuildValue("",8.5,103.2);
58          //4.2 調用python 的add函數
59          PyObject *fe=PyEval_CallObject(pFunc_add, arg3);                      //pFunc 調用函數
60          //4.3返回值處理
61          float res2=0;
62          PyArg_Parse(fe,"f",&res2);//是浮點數
63 
64          //4.4 輸出結果
65          qDebug()<<"add(f):"<<res2;
66 */
67          Py_Finalize();             //Py_Finalize 結束
68     return 0;
69 }

 

4.python 文件存放目錄 
   .py,.pyc與.exe3個文件同文件夾。

 

 

 

 5.python文件
    

def run():
    print("hello qt")

def add(a,b):
    return a+b

 






           


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM