将 matplotlib 图表嵌入到 Qt/C++ 应用程序中

2023-11-21

我正在 Qt/C++ 中开发面向数学的 GUI 应用程序,并希望嵌入 Python 脚本,包括 NumPy 和 Matplotlib。使用 Python C API,我最终成功运行了一个脚本,从 Python 变量中检索值,包括 NumPy 数组等。但我未能将 Matplotlib 图表绘制到我的 Qt/C++ 应用程序中。

更好的说法是,我已经设法使用Python脚本将图表的RGBA缓冲区保存到一个变量中,然后将变量的值作为缓冲区类型的PyObject获取,获取缓冲区并将其转换为QImage,然后转换为QPixmap,最后将它进入QLabel并显示它。

但我仍然缺少它的交互行为,调整大小等。虽然似乎可以通过将 Qt 鼠标事件转发到figure.canvas.button_press_event 来完成,但它变得过于复杂......所以我得出的结论是我不理解原理Python 嵌入得足够好。我缺少一些明显的东西。

我发现了一些将 matplotlib 图表嵌入到 PyQt 或 PySide(即用 Python 编写的)应用程序中的示例,在这些应用程序中我看到了类似 QMainWindow.setCentralWidget(canvas) 或 layout.addWidget(canvas) 的内容。这里画布是FigureCanvasQTAgg对象(http://matplotlib.org/api/backend_qt4agg_api.html ).

这表明canvas继承自QWidget。但是当我尝试使用 Python 的 C API 在 C++ 代码中模仿这一点时,我最终得到的只是一个 PyObject *canvas,不知道如何将其转换为 QWidget。这是我的片段,没有重要的步骤:

//draw a figure in Python script called from C++ app
PyRun_SimpleString("import matplotlib\n"
"matplotlib.use('Qt4agg')\n" //use Qt4 backend
"import pylab\n"
"pylab.plot(randn(10))\n" //plot something
"fig = pylab.gcf()\n" //take current figure
"canvas = fig.canvas" //canvas is of FigureCanvasQTAgg type

//get canvas as PyObject
PyObject* m = PyImport_AddModule("__main__");
PyObject* canvas = PyObject_GetAttrString(m, "canvas");
//from what I know, canvas is a PyObject wrapped around an object derived from QWidget

//...
//... here I do not know how to convert canvas (i.e. PyObject) into canvasWidget (i.e. QWidget)???
//... 

//show chart as a widget
MyWindow.setCentralWidget(canvasWidget)

正如我所写的,我一定遗漏了一些明显的东西。我用谷歌到处搜索但没有成功。任何帮助将不胜感激。


对于 PySide,我建议阅读这个 comp.lib.qt.pyside 线程还有关于类型转换器在 PySide 文档中。我不能保证绝对正确这段代码,但它似乎做你想做的事。

对于 PyQt 来说,相同的 comp.lib.qt.pyside 线程链接到一个示例解包 SIP 对象这又正是您所需要的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 matplotlib 图表嵌入到 Qt/C++ 应用程序中 的相关文章

随机推荐