gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 19:28:41 24 4
gpt4 key购买 nike

我正在使用 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) 的内容。这里的 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,我建议阅读 this comp.lib.qt.pyside thread还有关于 type converters 的部分在 PySide 文档中。我不能保证 this code 的绝对正确性,但它似乎可以满足您的要求。

对于 PyQt,the same comp.lib.qt.pyside thread链接到 unwrapping SIP objects 的示例这又正是您所需要的。

关于python - 将 matplotlib 图表嵌入到 Qt/C++ 应用程序中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18678982/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com