Osadzanie wykresu matplotlib w aplikacji Qt / C ++

Opracowuję aplikację GUI zorientowaną na matematykę w Qt / C ++ i chciałbym osadzić skrypty Pythona, w tym NumPy i Matplotlib. Używając Python C API, w końcu udało mi się uruchomić skrypt, pobrać wartości ze zmiennych Pythona, w tym tablice NumPy itp. Ale nie udało mi się narysować wykresów Matplotlib w mojej aplikacji Qt / C ++.

Lepiej powiedzieć, udało mi się zapisać bufor RGBA wykresu do zmiennej za pomocą skryptu Pythona, a następnie pobrać wartość zmiennej jako PyObject typu bufora, pobrać bufor i przekształcić go w QImage, a następnie w QPixmap i ostatecznie umieścić w QLabel i wyświetl go.

Ale wciąż brakuje mi jego interaktywnego zachowania, zmiany rozmiaru itp., Chociaż wydaje się, że można to zrobić, przekazując zdarzenia myszy Qt do figure.canvas.button_press_event, ale wtedy staje się to zbyt skomplikowane ... Więc doszedłem do wniosku, że nie rozumiem zasad osadzania Pythona wystarczająco dobrze. Brakuje mi czegoś oczywistego.

Znalazłem kilka próbek osadzania wykresów matplotlib w aplikacjach PyQt lub PySide (tj. Napisanych w Pythonie), w których widziałem coś takiego jak QMainWindow.setCentralWidget (canvas) lub layout.addWidget (canvas). Tutaj płótno jest obiektem FigureCanvasQTAgg (http://matplotlib.org/api/backend_qt4agg_api.html ).

Sugeruje to, że płótno dziedziczy z QWidget. Ale kiedy próbuję naśladować to w kodzie C ++ za pomocą API C języka Python, kończę na płótnie PyObject *, nie wiedząc, jak przekształcić go w QWidget. To mój fragment bez ważnego kroku:

//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)

Jak pisałem, muszę przegapić coś oczywistego. Szukałam wszędzie, ale bez powodzenia. Każda forma pomocy jest mile widziana.

questionAnswers(1)

yourAnswerToTheQuestion