我想使用pySead定义基本的Qt类和C++和Python之间的映射,但是在Python:Python:Python中使用独立的Python代码和嵌入的Python来这样做。在
首先,模块定义和返回QPointF的类:
QPointF X::getY() {
return QPointF();
}
BOOST_PYTHON_MODULE(myBoostPythonModule)
{
// is there some magic init/register commands to put here?
boost::python::api::object module = import("__main__");
boost::python::api::object name_space = module.attr("__dict__");
boost::python::exec("from PySide.QtCore import *",name_space,name_space);
boost::python::exec("import sys,os\nprint(sys.modules)",name_space,name_space);
class_<X, boost::noncopyable>(
"X", init<const char*>())
.def("getY",&X::getY)
;
}
现在,应用程序的嵌入式python代码,最后一行是失败的,我想知道如何解决:
^{pr2}$这里发生了什么,我可以创建一个QPointF,但是名称不知怎么地没有绑定在python和c++之间?我是否在模块中丢失了一些导入来告诉它从PySide导入?在
根据前面的回复和我发现的其他信息,这里有一个通用的例程,允许像
PySide.QtGui.QColor
参数这样的东西传递到一个需要QColor&
输入参数的PySide.QtGui.QColor
包装的c++方法中:并且,从启动函数调用上述函数:
^{pr2}$PySide使用Shiboken提供其Qt绑定。Shiboken生成pythoncapi绑定,这些绑定支持自己的类型转换系统。这些转换的知识存在于Shiboken生成的绑定中,而不是Python类型系统中。因此,pySead知道如何将^ {< CD1> }对象转换为C/C++/Python;Python的类型系统不转换。在
当对象通过用Boost.Python,那么Boost.Python将检查其注册表以查找适当的类型转换器。这些转换器提供Boost.Python关于如何将C/C++/Python转换为通过类型公开的知识Boost.Python. 因此,什么时候Boost.Python试图将^ {< CD1> } C++类型返回到Python,因为转换未注册,它抛出异常。Boost.Python. 在
下面是带注释的代码:
有可能实现Boost.Python的converters表示另一个实现。展开Shiboken type converter example,下面是一个完整的示例Boost.Python的转换器使用Shiboken的老式转换器实现。我本来会使用新的Shiboken类型转换器API,但我不清楚它是基于文档的什么。在
^{pr2}$以及它的用法:
另一种方法,虽然不是最优雅的方法,但是可以从Boost.Python使用
boost::python::object
类型,并通过Python语句与对象接口。类似于:上面的代码将让Python实例化一个
QPointF
Python对象,该对象将委托给Shiboken的类型系统。当X::getY()
返回一个泛型对象时,Boost.Python当对象句柄从C++过渡到Python时,将不会尝试执行类型转换。在相关问题 更多 >
编程相关推荐