QT中調用python

一.概述

1.Python功能強大,很多Qt或者c/c++開發不方便的功能可以由Python編碼開發,尤其是一些算法庫的應用上,然后Qt調用Python。

2.在Qt調用Python的過程中,必須要安裝python環境,并且Qt Creator中編譯器與Python的版本要對應,具體來說編譯器是64位安裝Python就是64位,編譯器32位安裝Python就是32位。

3.本文測試使用的QT版本為:QT5.12; ?python版本為python-3.12

4.Qt調用python主要有兩種方式:

一是混合編程模式,直接調用python文件內的函數,比較靈活,也是本文重點講述的方法;

二是直接調用python腳本文件,比較簡單,但是不夠靈活。

二.混合編程代碼實現

1.環境配置

(1)pro文件中添加python的頭文件和依賴庫:

INCLUDEPATH += -I D:\python\Lib\site-packages\numpy\core\include

INCLUDEPATH += -I D:\python\include

LIBS += -L D:\python\libs -l_tkinter -lpython3 -lpython312

(2)修改include文件夾中的object.h文件,因為Python中slots是關鍵字,Qt中slots也是關鍵字,會沖突。

#undef slots

????PyType_Slot *slots; /* terminated by slot==0. */

#define slots Q_SLOTS ?

2.代碼實現

(1)Python代碼添加目錄及內容

添加test1.py文件到qt生成exe目錄,比如:

../build-qt_python-Desktop_Qt_5_12_10_MinGW_64_bit-Debug/debug/testb.py

否則無法調用py文件。

Python代碼:

def hello():

????print("hello")

def mix(a,b):

????print("=======================")

????r1 = a + b

????r2 = a - b

return (r1, r2)

2.qt代碼

#include <QCoreApplication>

#include <Python.h>

#include <QDebug>

#include <numpy/arrayobject.h>

int Test_hello(void)

{

????//初始化python模塊

????Py_Initialize();

????if ( !Py_IsInitialized() )

????{

????????return -1;

????}

????//導入testb.py模塊

????PyObject* pModule = PyImport_ImportModule("testb");

????if (!pModule) {

????????qDebug("Cant open python file!\n");

????????return -1;

????}

????//獲取test模塊中的hello函數

????PyObject* pFunhello= PyObject_GetAttrString(pModule,"hello");

????if(!pFunhello){

????????qDebug()<<"Get function hello failed";

????????return -1;

????}

????//調用hello函數

????PyObject_CallFunction(pFunhello,NULL);

????//結束,釋放python

????Py_Finalize();

????return 0;

}

int Testt_mix(void)

{

????//初始化python模塊

????Py_Initialize();

????if ( !Py_IsInitialized() )

????{

????????return -1;

????}

????PyObject* pModule = PyImport_ImportModule("testb");//注意文件名字大小寫

????if (!pModule) {

????????qDebug("Cant open python file!\n");

????????return -1;

????}

????PyObject* pyFunc_mix = PyObject_GetAttrString(pModule, "mix");

????if (pModule && PyCallable_Check(pyFunc_mix))

????{

????????PyObject* pyParams = PyTuple_New(2); //定義兩個變量

????????PyTuple_SetItem(pyParams, 0, Py_BuildValue("i", 5));// 變量格式轉換成python格式

????????PyTuple_SetItem(pyParams, 1, Py_BuildValue("i", 2));// 變量格式轉換成python格式

????????int r1 = 0, r2 = 0;

????????PyObject* pyValue = PyObject_CallObject(pyFunc_mix, pyParams); //調用函數返回結果

????????PyArg_ParseTuple(pyValue, "i|i", &r1, &r2);//分析返回的元組值

????????if (pyValue)

????????{

????????????qDebug("result: %d ??%d\n", r1, r2);

????????}

????}

????//結束,釋放python

????Py_Finalize();

????return 0;

}

int main(int argc, char *argv[])

{

????QCoreApplication a(argc, argv);

????Test_hello();

????Testt_mix();

???return a.exec();

}

3.輸出結果

三.直接調用python腳本模式

1.python文件

import sys

def test():

????a = 1

????print (a)

if __name__=='__main__':

???b = test()

???print (b)

2.QT代碼

??????//第一步:初始化Python

??????Py_Initialize();

??????//檢查初始化是否完成

??????if (!Py_IsInitialized())

??????{

??????????return -1;

??????}

??????//第二步:導入sys模塊

??????PyRun_SimpleString("import sys");

??????const char* code = "with open('./debug/scriptpy.py', 'r') as file: exec(file.read())";

??????// 執行代碼字符串

??????if (PyRun_SimpleString(code) != 0)

??????{

??????????// 處理錯誤

??????????PyErr_Print();

??????????return -1;

??????}

??????Py_Finalize();

3.執行結果

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/697414.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/697414.shtml
英文地址,請注明出處:http://en.pswp.cn/news/697414.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

OpenCV:計算機視覺領域的瑞士軍刀

摘要 本文將深入探索OpenCV&#xff08;開源計算機視覺庫&#xff09;的基本概念、應用領域、主要功能和未來發展。通過本文&#xff0c;讀者將能夠理解OpenCV在計算機視覺中的重要性&#xff0c;并掌握其基本使用方法。 一、引言 隨著人工智能和機器學習技術的飛速發展&…

IDEA啟動Springboot報錯:無效的目標發行版:17 的解決辦法

無效的目標發行版&#xff1a;17 的解決辦法 一般有兩個原因&#xff0c;一可能是本地沒有安裝JDK17&#xff0c;需要安裝后然后在IDEA中選擇對應版本&#xff1b;二可能是因為IDEA版本太低&#xff0c;不支持17&#xff0c;需要升級IDEA版本。然后在File->Project Struct…

未雨綢繆,才是真正的高手

由于電腦用了五年半&#xff0c;剛換了新型電腦主機&#xff0c;人老了摸索掌握新操作方法較困難&#xff0c;所以今天的網文作業只好從簡&#xff0c;即本“人民體驗官”推廣人民日報官方微博文化產品《夜讀&#xff1a;真正的高手&#xff0c;都懂得凡事提前一步》。 圖&…

Flutter常用命令,持續更新

目錄 前言 Flutter 常用命令 Dart 常用命令 adb 常用命令&#xff08;用于 Android 開發&#xff09; 前言 當在開發Flutter項目時&#xff0c;熟悉一些常用的命令是非常重要的。這些命令可以幫助你執行各種任務&#xff0c;從構建應用程序到調試和測試。以下是一些Flutte…

Draw.io | 強大并且免費的畫圖工具

前言 作為一個技術人&#xff0c;總是需要一個稱手的畫圖工具&#xff0c;日常工作中&#xff0c;畫的最多的圖應該就是流程圖&#xff0c;思維導圖&#xff0c;如果開發時間比較久的話&#xff0c;可能還需要畫架構圖。剛開始的時候&#xff0c;我下載了各種工具&#xff0c;像…

Aigtek電壓放大器的應用場合有哪些

電壓放大器是一種主要用于信號處理的重要電子設備&#xff0c;它可以將輸入的低電壓信號放大到較高的輸出電壓水平。在各個應用領域中&#xff0c;電壓放大器發揮著重要的作用。下面西安安泰點擊將介紹電壓放大器的應用場合。 通信系統&#xff1a;電壓放大器在通信系統中具有重…

【打工日常】使用docker部署StackEdit編輯器-Markdown之利器

一、StackEdit介紹 StackEdit一款強大的在線Markdown編輯器&#xff0c;不僅具備卓越的寫作功能&#xff0c;還支持實時預覽、多設備同步等特性。 很多時候基于安全和信息保密的關系&#xff0c;建議放在自己的服務器或者本地linux去運行&#xff0c;這樣會比較省心。 二、本次…

Nginx跳轉模塊location

一.location模塊概述 1.定義 location塊是server塊的一個指令。作用&#xff1a;基于Nginx服務器接收到的請求字符串&#xff0c;虛擬主機名稱&#xff08;ip&#xff0c;域名&#xff09;、url匹配&#xff0c;對特定請求進行處理。 2.三種匹配類別 精準匹配&#xff1a;l…

企業微信變更企業主體的流程

企業微信變更主體有什么作用&#xff1f;做過企業運營的小伙伴都知道&#xff0c;很多時候經常會遇到現有的企業需要注銷&#xff0c;切換成新的企業進行經營的情況&#xff0c;但是原來企業申請的企業微信上面卻積累了很多客戶&#xff0c;肯定不能直接丟棄&#xff0c;所以這…

【Flink數據傳輸(一)】NetworkStack架構概述:實現tm之間的數據交換

文章目錄 1. NetworkStack整體架構2. StreamTask內數據流轉過程 NetworkStack提供了高效的網絡I/O和反壓控制 除了各個組件之間進行RPC通信之外&#xff0c;在Flink集群中TaskManager和TaskManager節點之間也會發生數據交換&#xff0c;尤其當用戶提交的作業涉及Task實例運行在…

ubuntu20.04中配置Pyrep和CoppeliaSim

ubuntu20.04中配置Pyrep和CoppeliaSim 在Ubuntu20.04中配置 Pyrep &#xff0c;實現應用Python語言的機器人在 Vrep&#xff08;CoppeliaSim&#xff09;中的虛擬仿真 一、安裝CoppeliaSim 4.1 1.1 下載適配Ubuntu20.04的CoppeliaSim 4.1軟件 下載鏈接&#xff1a;https://…

5.iframe

iframe 經典真題 iframe 框架有哪些優缺點&#xff1f;iframe 用來干什么的 iframe 介紹 iframe 稱之為嵌入式框架&#xff0c;嵌入式框架可以把一個完整的網頁內容嵌入到現有的網頁中。 下面是一個 iframe 的簡單示例&#xff1a; <body><p>iframe 示例<…

ssm+springmvc基于springboot的寵物領養系統的設計與實現_j5fk4

寵物領養系統主要是為了提高管理員的工作效率&#xff0c;滿足管理員對更方便、更快、更好地存儲所有信息和數據檢索功能的要求。通過對多個類似網站的合理分析&#xff0c;確定了寵物領養系統的各個模塊。考慮到用戶的可操作性&#xff0c;經過深入調查研究&#xff0c;遵循系…

vue3中mockjs模擬獲取數據

開發項目的時候&#xff0c;如果后端接口沒有出來&#xff0c;前端工程師也不必非得等接口出來才進行下步開發。可以使用mock.js來模擬接口數據&#xff0c;以下就是使用vue3設置hook函數來封裝axios請求&#xff0c;配合mock.js來實現的代碼&#xff0c;mock的官網 Mock.js 一…

力扣算法Algorithm競賽模板庫(codeforces-go):含了算法競賽中常用的數據結構和算法實現,助力開發者更高效地解決問題

1.算法Algorithm競賽模板庫&#xff08;codeforces-go&#xff09; 算法競賽模板庫&#xff0c;為算法競賽愛好者提供了一系列精心設計的算法模板。這個庫包含了算法競賽中常用的數據結構和算法實現&#xff0c;助力開發者更高效地解決問題 一個算法模板應當涵蓋以下幾點&…

C語言------字符串函數(2)

1.strcat函數功能實現 ? char* mystrcat(char* dest, const char* src) {assert(dest);assert(src);char* ret dest;//找到目標空間里面的斜杠0的位置&#xff0c;再追加while (*dest ! \0){dest;}while ((*dest *src)){;}return ret; } int main() {char arr1[20] "…

【信息系統項目管理師】--【信息技術發展】--【現代化創新發展】--【物聯網】

文章目錄 第二章 信息技術發展2.2 新一代信息技術及應用2.2.1 物聯網1.技術基礎2.關鍵技術3.應用和發展 第二章 信息技術發展 信息技術是在信息科學的基本原理和方法下&#xff0c;獲取信息、處理信息、傳輸信息和使用信息的應用技術總稱。從信息技術的發展過程來看&#xff0c…

Android 圓環帶刻度條進度動畫效果實現

效果圖 需求是根據傳感器做一個重力球效果&#xff0c;先實現了動畫后續加上跟傳感器聯動. 又是擺爛的一天&#xff0c; 尚能呼吸&#xff0c;未來可期啊 View源碼 package com.android.circlescalebar.view;import android.content.Context; import android.content.res.Typ…

C++ //練習 7.58 下面的靜態數據成員的聲明和定義有錯誤嗎?請解釋原因。

C Primer&#xff08;第5版&#xff09; 練習 7.58 練習 7.58 下面的靜態數據成員的聲明和定義有錯誤嗎&#xff1f;請解釋原因。 //example.h class Example{public:static double rate 6.5;static const int vecSize 20;static vector<double> vec(vecSize); };//e…

【治愈系】心靈雞湯美文:溫暖你的每一寸心田

1.人生就像一杯茶&#xff0c;不會苦一輩子&#xff0c;但總會苦一陣子。只有經歷過苦澀&#xff0c;才能品味到甜美的滋味。 2.每一次失敗都是一次寶貴的經驗&#xff0c;它教會我們如何更好地面對困難和挑戰。不要害怕失敗&#xff0c;因為失敗是成功的前奏。 3.人生最重要的…