Einbetten eines Matplotlib-Diagramms in eine Qt / C ++ - Anwendung

Ich entwickle eine mathematisch orientierte GUI-Anwendung in Qt / C ++ und möchte ein Python-Skript einbetten, einschließlich NumPy und Matplotlib. Mit der Python C-API konnte ich endlich ein Skript ausführen, die Werte aus den Python-Variablen abrufen, einschließlich NumPy-Arrays usw. Aber ich konnte Matplotlib-Diagramme nicht in meine Qt / C ++ - Anwendung zeichnen.

Es ist besser zu sagen, ich habe es geschafft, den RGBA-Puffer des Diagramms mithilfe eines Python-Skripts in einer Variablen zu speichern, dann den Wert der Variablen als PyObject des Puffertyps abzurufen, den Puffer abzurufen und ihn in QImage und dann in QPixmap zu transformieren und schließlich zu platzieren es in QLabel und zeigen Sie es an.

Aber ich vermisse immer noch sein interaktives Verhalten, die Größenänderung usw., obwohl es so scheint, als ob es durch Weiterleiten von Qt-Mausereignissen an figure.canvas.button_press_event geschehen kann, aber es wird dann zu kompliziert ... Also kam ich zu dem Schluss, dass ich die Prinzipien nicht verstehe von Python gut genug einbetten. Mir fehlt etwas Offensichtliches.

Ich habe einige Beispiele zum Einbetten von Matplotlib-Diagrammen in PyQt- oder PySide-Anwendungen (d. H. In Python geschrieben) gefunden, bei denen ich so etwas wie QMainWindow.setCentralWidget (Zeichenfläche) oder layout.addWidget (Zeichenfläche) gesehen habe. Hier ist Canvas ein FigureCanvasQTAgg-Objekt (http://matplotlib.org/api/backend_qt4agg_api.html ).

Dies deutet darauf hin, dass Canvas von QWidget erbt. Aber wenn ich versuche, dies in C ++ - Code mithilfe der C-API von Python nachzuahmen, beende ich nur einen PyObject * -Leinwand und weiß nicht, wie ich ihn in ein QWidget umwandeln soll. Dies ist mein Ausschnitt ohne den wichtigen Schritt:

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

Wie ich schrieb, muss mir etwas Offensichtliches fehlen. Ich habe überall gegoogelt, aber ohne Erfolg. Jede Hilfe wäre sehr dankbar.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage