首页 > 编程语言 >QT设置回调函数给python调用——参数法

QT设置回调函数给python调用——参数法

时间:2024-07-09 10:42:38浏览次数:10  
标签:调用 QT python PyObject Python 模块 NULL 函数

这种方法将回调函数作为python函数参数对象的方法来使用。

Qt已经添加了Python库,并且能够正常调用Python的API,可以成功调用Python的代码块,这部分可以参考我另外一篇博客:QT中调用python中的函数 - Henkk - 博客园 (cnblogs.com)

1.QT 相关函数定义

1.1 创建回调函数例如下面两个函数

// 实际的回调函数
void printValue(int value) {
    qDebug() << "printValue value: " << value;
}

int getValue(int value) {
    qDebug() << "getValue value: " << value;
    return value;
}

1.2 封装回调函数为python可调用的对象

// 包装回调函数,使其成为Python可调用对象
PyObject* cprintValue(PyObject* self, PyObject* args) {
    int value;
    if (!PyArg_ParseTuple(args, "i", &value)) {
        return NULL;
    }
    printValue(value);
    return Py_None;
}

PyObject* cgetValue(PyObject* self, PyObject* args) {
    int value;
    if (!PyArg_ParseTuple(args, "i", &value)) {
        return NULL;
    }
    return Py_BuildValue("i", getValue(value));
}

1.3模块方法定义

// 模块方法定义
// 结构体第三个参数
// METH_VARARGS:方法接受可变数量的参数。
// METH_KEYWORDS:方法接受关键字参数。
// METH_NOARGS:方法不接受参数。
// METH_O:方法接受一个对象参数。
static PyMethodDef CallbackMethods[] = {
    {"cprintValue", cprintValue, METH_VARARGS, "printValue callback function"},
    {"cgetValue", cgetValue, METH_VARARGS, "getValue callback function"},
    {NULL, NULL, 0, NULL} //这一行为结束的标识
};

1.4模块定义

// 模块定义
static struct PyModuleDef CallbackModule = {
    PyModuleDef_HEAD_INIT,
    "callback",   // 模块名称
    NULL,         // 模块文档描述
    -1,           // 模块状态
    CallbackMethods, //模块中的函数和方法
    nullptr, //指向一个 PyModuleDef_Slot 结构体数组的指针,用于定义模块的特殊属性
    nullptr, //指向一个函数指针,用于遍历模块对象的函数
    nullptr, //指向一个函数指针,用于清除模块对象的函数
    nullptr //指向一个函数指针,用于释放模块对象的函数
};

1.5模块初始化函数定义

// 模块初始化函数
PyMODINIT_FUNC PyInit_callback(void) {
    PyObject *m = PyModule_Create(&CallbackModule);
    if(m == NULL){
        qDebug("PyInit_callback failed!");
        return NULL;
    }
    return m;
}

 

2. python 相关函数定义

创建“python_script_1.py”文件 定义回调函数的测试函数如下:

# python_script_1.py

#cprintValue为上面模块方法定义的函数名
def pyPrintValue(func):
func.cprintValue(45)

#cgetValue为上面模块方法定义的函数名
def pyGetValue(func):
func.cgetValue(256)

3. QT 测试

int main(int argc, char *argv[]) {
    QCoreApplication app(argc, argv);

    // 设置Python解释器的路径
    Py_SetPath(L"D:\\Python\\Python38_64;D:\\Python\\Python38_64\\DLLs;D:\\Python\\Python38_64\\lib");

    // 初始化Python解释器
    Py_Initialize();

    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path.append('./')");

    PyObject *model = PyImport_ImportModule("python_script_1");
    if(model == NULL){
        qInfo() << "model is nullptr!";
        return -1;
    }

    PyObject *pyPrintValue = PyObject_GetAttrString(model,"pyPrintValue");
    if(pyPrintValue == NULL){
        qInfo() << "pyPrintValue is nullptr!";
        return -1;
    }
    PyObject* para = PyInit_callback();

    PyObject* pReturnValue;
    PyObject* args = PyTuple_New(1);
    PyTuple_SetItem(args, 0, para);
    pReturnValue = PyObject_CallObject(pyPrintValue, args);

    PyObject *pyGetValue = PyObject_GetAttrString(model,"pyGetValue");
    if(pyGetValue == NULL){
        qInfo() << "pyGetValue is nullptr!";
        return -1;
    }
    PyObject* pReturnValue2;
    PyObject* args2 = PyTuple_New(1);
    PyTuple_SetItem(args2, 0, para);
    pReturnValue2 = PyObject_CallObject(pyGetValue, args2);

    // 结束Python解释器
    Py_Finalize();
//    PyMem_RawFree(program);

    return app.exec();
}

 参考:Qt/C++调用Python,以函数指针转PyObject*作回调使用_c++回调python的qt对象-CSDN博客

 

标签:调用,QT,python,PyObject,Python,模块,NULL,函数
From: https://www.cnblogs.com/henkk/p/18291273

相关文章

  • Qt 控件的简单实例化
    记录一个初学小白的学习过程,记录一些浅显的学习笔记GroupBoxGroupBox控件的作用是组织界面元素,将一组相关的控件组合在一起,并在顶部显示一个标题。基类:QWidget (第一部分是widget.h)(第二部分是widget.cpp)#ifndefWIDGET_H#defineWIDGET_H#include<QWidget>#inc......
  • 基于Python与GDAL的栅格转矢量(去边框)、添加缓冲区、简化容差
    文章目录概要整体内容简化矢量数据并应用容差小结概要在地理信息系统(GIS)中,栅格数据与矢量数据之间的转换是一项基本且重要的操作。栅格数据通常用于表示连续变化的数据(如温度、海拔等),而矢量数据则更适合表示离散的地理要素(如点、线、面)。此外,为矢量要素添加缓冲区是......
  • 智慧工地安全绳检测识别系统 Python
    智慧工地安全绳检测识别系统利用现场已有的监控摄像头,智慧工地安全绳检测识别系统通过机器视觉+边缘计算实时分析监控画面数据不用人工控制;智慧工地安全绳检测识别系统可以及时发现监控区域人员未佩戴安全绳违规行为,迅速及时地给予预警提醒,协助后台人员高效的监督现场安全作业,......
  • python matplot绘图工具练习
    #pyplotimportmatplotlib.pyplotaspltimportnumpyasnpimportseabornassnsimportpandasaspdx_point=np.array([0,6])y_point=np.array([0,100])plt.plot(x_point,y_point,'b-.v')#格式处理plt.show()x=np.arange(0,4*np.pi,0.1)y=......
  • 【视频讲解】Python、R时间卷积神经网络TCN与CNN、RNN预测时间序列3实例附代码数据
    全文链接:https://tecdat.cn/?p=36944原文出处:拓端数据部落公众号本文旨在探讨时间卷积网络(TemporalConvolutionalNetwork,TCN)与CNN、RNN在预测任务中的应用。通过引入TCN模型,我们尝试解决时间序列数据中的复杂依赖关系,以提高预测的准确性。本文首先介绍了TCN的基本原理,随后详......
  • [QT入门]标签控件(QLabel)
    一、概述QLabel是Qt中用于显示文本或图像的控件。它通常被用作标签或显示静态信息的区域。QLabel控件是图形用户界面(GUI)开发中的基础元素之一,广泛应用于各种Qt应用程序中。QLabel控件的灵活性和易用性使其成为开发过程中不可或缺的一部分。二、QLabel控件的基本属性和方法1.......
  • Python——习题练习 part3 函数进阶
    本篇文章记录函数进阶部分的知识点及例题代码。目录六,函数进阶01 函数的多返回值02函数的传参方式 1,位置参数2,关键字参数3,缺省参数4,不定长参数a,位置传递b,关键字传递03lambda匿名函数六,函数进阶01 函数的多返回值#函数的多返回值deftest_return():......
  • 构建 Qt 项目
    使用qmake构建Qt项目源代码创建一个Qt项目文件(.pro文件)和一个源文件:MyQtProject.pro:QT+=coreguiCONFIG+=c++11SOURCES+=main.cpp#如果你有UI文件或头文件,也可以添加到这里。#HEADERS+=mainwindow.h#FORMS+=mainwindow.uimain.cpp:#inc......
  • Python进阶入门之DataFrame
    引言接上一篇《关于Python中的series详解与应用》。本篇将详细介绍DataFrame,主要包括它的定义、创建方法、常用操作、应用场景以及与其他数据结构的比较。什么是DataFrameDataFrame是Pandas库中的一种二维标签数据结构,可以看作是一种带有行和列标签的表格数据。它既有行索引......
  • 关于Python中的series详解与应用
    引言近期在学习Python的过程中学到了Pandas库,它是数据处理操作中一款非常强大且流行的工具。而Pandas的两个核心数据结构是Series和DataFrame(下一篇文章便会进行有关学习)。本篇将详细介绍Series,主要包括它的定义、创建方法、常用操作、应用场景以及与其他数据结构的比较,仅为......