Встраивание диаграммы matplotlib в приложение Qt / C ++
Я занимаюсь разработкой математического GUI-приложения на Qt / C ++ и хотел бы встроить скрипты Python, включая NumPy и Matplotlib. Используя Python C API, мне наконец удалось запустить скрипт, извлечь значения из переменных Python, включая массивы NumPy и т. Д. Но мне не удалось нарисовать диаграммы Matplotlib в моем приложении Qt / C ++.
Лучше сказать, мне удалось сохранить график »s RGBA-буфер к переменной с использованием скрипта Python, затем получить значение переменной как 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. Но когда я пытаюсь имитировать это в коде C ++, используя Python 'С C API, я заканчиваю только 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)
Как я уже писал, я, должно быть, упускаю что-то очевидное. Я гуглил везде, но безуспешно. Любая помощь будет принята с благодарностью.