2013-02-25 13 views
6

Ich möchte Python-Interpreter in eine Qt 5-Anwendung einbetten.Einbetten von Python in Qt 5

Ich habe eine funktionierende Anwendung in Qt 5, aber wenn ich setzte

#include <Python.h> 

an der Spitze (unten Qt-Header) die Zusammenstellung bricht mit

../sample/python3.3m/object.h:432:23: error: expected member name or ';' after declaration specifiers 
PyType_Slot *slots; /* terminated by slot==0. */ 
~~~~~~~~~~~  ^

Wenn ich Python-Header über dem Qt setzen Header es bricht mit

In file included from ../Qt5.0.1/5.0.1/clang_64/include/QtGui/QtGui:59: 
../Qt5.0.1/5.0.1/clang_64/include/QtGui/qpagedpaintdevice.h:63:57: error: expected '}' 
        A0, A1, A2, A3, A5, A6, A7, A8, A9, B0, B1, 
                 ^
/usr/include/sys/termios.h:293:12: note: expanded from macro 'B0' 
#define B0  0 
       ^
../Qt5.0.1/5.0.1/clang_64/include/QtGui/qpagedpaintdevice.h:62:19: note: to match this '{' 
    enum PageSize { A4, B5, Letter, Legal, Executive, 
       ^
1 error generated. 

Bitte weiß jemand, warum dies passiert? Ich könnte sein, weil Qt und Python einige gebräuchliche Wörter definieren? Was kann ich tun?

Antwort

6

Das passiert, weil die Einbeziehung von Python.h zuerst indirekt enthält termios.h, die B0 definiert als 0, die wiederum qpagedpaintdevice.h als Variablenname verwenden möchten. Einschließlich Python.h, nachdem die Qt-Includes das Gleiche tun, genau umgekehrt mit der Zeichenfolge 'Slots'.

Ich schlage vor, die folgende Reihenfolge:

#include <Python.h> 
#undef B0 
#include <QWhatEver> 
2

Eine Alternative zur akzeptierten Antwort:

Da Qt verwendet die slots als reservierte Schlüsselwörter ein Zusammenstoß mit der Erklärung des Mitglieds slots der ist PyType_Spec Struktur in der Python-API.

Qt kann angewiesen werden, das normale moc-Schlüsselwort nicht zu verwenden. Dadurch wird der Konflikt behoben. Dazu fügen Sie Ihrer Projektdatei Folgendes hinzu: CONFIG += no_keywords

Der Nachteil ist dann, dass Sie sich auf die entsprechenden Qt-Makros anstelle der vorherigen Schlüsselwörter beziehen müssen.

Somit werden die folgenden Ersetzungen werden für die Qt Seite benötigt: signals -> Q_SIGNALS slots -> Q_SLOTS emit -> Q_EMIT

Dies wird in den Qt-Dokumentation auf Signalen und den Schlitzen auf dem Abschnitt Using Qt with 3rd Part Signals and Slots erläutert.

PS: Dies ist normalerweise eine gute Option beim Starten eines neuen Projekts, nicht beim Hinzufügen von Python zu einer vorhandenen Codebasis, die die Qt-Schlüsselwörter ausgiebig verwendet.