QT怎样将一个结构体作为函数参数从C++传递到QML

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QT怎样将一个结构体作为函数参数从C++传递到QML相关的知识,希望对你有一定的参考价值。

参考技术A 不太好传, 除非是QT标准的数据结构, 一开始我也纠结这个, 后面直接传JSON对象就好了。 结构体就算了把, QML不支持本回答被提问者采纳

从 C++ 调用 python 函数时如何将 C++ 类作为参数传递?

【中文标题】从 C++ 调用 python 函数时如何将 C++ 类作为参数传递?【英文标题】:How to pass C++ classes as arguments when calling python functions from C++? 【发布时间】:2014-12-07 23:33:02 【问题描述】:

我正在编写一个需要加载 Python 模块并调用该模块中的函数的 C++ 应用程序。 应用程序需要将 C++ 分类作为参数传递给 python 函数。 我设法从 C++ 代码中调用 python 代码,但我只设法将“原始”类型作为参数传递。

我使用 SWIG 创建包装器/接口,但我找不到如何将我的 C++ 类从应用程序转换为 PyObject* 以便将其作为参数传递给 python 函数。

您知道我在哪里可以找到有关如何执行从 C++ 转换为 PyObject* 的信息吗?

【问题讨论】:

【参考方案1】:

Boost 有一个 Python 接口库,可能对你有帮助。

check it out

heres the documentation on functions

【讨论】:

【参考方案2】:

我仍然没有解决方案,我只有以下解决方法: 1. 我从实例创建一个 PyObject,并将它传递给 python 函数。 2. python 代码,使用 SWIG 生成的库中的一个函数,将 PyObject 转换为该类的 python 版本。

实现:

在 C++ 文件中

MyClass myObject;
...
PyObject *parameterForPython = PyCObject_FromVoidPtr(&myObject, NULL); // step 1
PyTuple_SetItem(pyArgs, 0, parameterForPython);
PyObject_CallObject(pythonFunctionObject, pyArgs);

在 swig 接口文件中(步骤 2 的代码):

%inline %
    MyClass *convertPyObjectToMyClass(PyObject * ptr) 
        return (MyClass *)PyCObject_AsVoidPtr(ptr)
    
%

在python模块中:

def myPythonFunction(ptr):
    myObject = cppmodule.convertPyObjectToMyClass(ptr) #step 2

【讨论】:

【参考方案3】:

您考虑过使用SWIG_NewPointerObj(ptr, type, flags)SWIG_ConvertPtr(obj, pptr, type, flags) 吗?

您可以通过运行获得这些声明:

swig -python -external-runtime swig-python.h

【讨论】:

以上是关于QT怎样将一个结构体作为函数参数从C++传递到QML的主要内容,如果未能解决你的问题,请参考以下文章

C语言中,结构体作为函数参数传递,详解?

疑问C++结构体(数组)指针作为函数参数,会不会修改实参的值?

结构体作为函数参数值传递的问题

C#调用C++的dll库怎么传递结构体中不定长度的char数组

在C代码中将结构体变量作为参数传递效率忒低

C#和C++传递结构体