【发布时间】:2019-03-05 19:48:16
【问题描述】:
简介
我正在尝试根据嵌入式 python 脚本中的计算状态更新 QT GUI 元素。我能够从 python 中提取所需的值,但无法设置对 c++ 对象的引用以使其工作。
详情
假设 Python 代码是这样调用的(在 calc.cpp 中):
void class_name::transfer(varA, varB, varC)
{
Py_Initialize();
emit inprogress(70); //HERE IT WORKS
object module = import("__main__");
object name_space = module.attr("__dict__");
exec_file("MyModule.py", name_space, name_space);
object MyFunc = name_space["MyFunc"];
object result = MyFunc(varA, varB, varC, callback);
double ret = extract<double>(result);
Py_Finalize();
}
void class_name::callback(double t_prog, double t_final)
{
progr = (double)t_prog / t_final * 100;
cout << progr; //To check if value is updating (It is)
emit inprogress(progr); //HERE IT FAIL
}
callback 是一个static 成员函数(在 calc.cpp 中)我用来提取一些值,指示在 python 脚本中的哪个阶段进行计算。它从 python 脚本(MyModule.py)循环调用:
while r.successful() and k < num_steps:
r.integrate(r.t + delta_t)
callback(r.t, t_final)
但是编译失败并出现以下错误:
非法调用非静态成员函数
非静态成员引用必须是相对于特定对象的
与emit inprogress(progr);相关
问题
我认为我应该将对象的引用从我的 c++ 传递给 python,然后通过回调返回给 c++。但我找不到如何做到这一点的方法。这样做的正确方法是什么?
经过测试的想法(仍然无效)
- 我试图简单地传递它,例如:
void class_name::callback(double t_prog, double t_final, class_name &cssd)但是python好像不能自动转换。 -
创建新的类对象:
class_name cs; emit cs.inprogress(progr);编译没有错误,但信号永远不会到达插槽 - 它创建新对象而不是引用现有对象。
【问题讨论】:
-
将信号连接到插槽的代码在哪里?
-
我将它包含在编辑中。
-
我根据我的实际知识修改了这个问题。
-
使回调成为一个对象,该对象将持有对
class_name实例的引用。给它一个像dispatch(double t_prog, double t_final)这样的方法,它将执行instance.callback(t_prog, t_final)(现有的callback成为非静态成员——可能想要重命名它)。 |或者你可以只提供一个指针作为现有静态回调函数的额外参数,但这不是很好。 -
你去。关于你的想法 - #1 需要类
class_name暴露给 Python(至少是类本身,而不是任何成员函数)。 #2 不起作用,因为您创建了一个新实例(但您需要的是原始实例)。
标签: python c++ qt signals boost-python