Встраивание диаграммы 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)

Как я уже писал, я, должно быть, упускаю что-то очевидное. Я гуглил везде, но безуспешно. Любая помощь будет принята с благодарностью.

Ответы на вопрос(1)

Ваш ответ на вопрос