2014-04-14 13 views
5

Ich möchte Python-Interpreter 3.4 in eine Qt 5.2.1-Anwendung (64-Bit) einbetten. Allerdings habe ich Build-Probleme, ich meine, wenn ich Python-Header in der main.cpp enthalten kompiliert es gut.Einbetten von Python3 in Qt 5

#include <python.h> 
#include "mainwindow.h" 
#include <QApplication> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    MainWindow w; 
    w.show(); 

    return a.exec(); 
} 

aber wenn ich es sonst überall setzen (nach Qt-Header)

// 
// embedpytest.cpp 
// 
#include <QLibrary> 
#include <python.h> 


EmbedPyTest::EmbedPyTest() 
{ 
} 

bekomme ich Fehler kompilieren:

C:\Python34\include\object.h:435: error: C2059: syntax error : ';' 
C:\Python34\include\object.h:435: error: C2238: unexpected token(s) preceding ';' 

enter image description here

Es ist sehr ähnliches Problem wie diese , aber die Lösung funktioniert nicht

Embedding Python in Qt 5

Weiß jemand, wie man dieses Problem löst? Oder schlage eine saubere Workaround vor, damit python.h und Qt5 glücklich zusammen leben können?

+0

Wie hat diese Antwort nicht für Sie funktioniert? Weil es für mich mit genau der gleichen Python und Qt Version wie du funktioniert hat. – cmannett85

+0

scheint unmöglich. Ich benutze 64-Bit-Python 3.4, 64-Bit-Qt 5.2.1 und Visual Studio 2012 – krusty

+0

Ich war mit g ++, vielleicht war das der Unterschied. – cmannett85

Antwort

3

Die säumige ist diese:

PyType_Slot *slots; /* terminated by slot==0. */ 

Das Problem ist, dass mit dieser Zeile "Slots" standardmäßig ein Schlüsselwort in Qt ist. Um diese Variablennamen in anderen Projekten zu verwenden, müssen Sie dies in Ihrer Projektdatei verwenden:

CONFIG += no_keywords 

Einzelheiten finden Sie in der documentation:

Mit Qt mit 3rd Party Signale und Slots

Es ist möglich, Qt mit einem Signal/Slot-Mechanismus eines Drittanbieters zu verwenden. Sie können beide Mechanismen sogar im selben Projekt verwenden. Fügen Sie einfach die folgende Zeile zu Ihrer qmake-Projektdatei (.pro) hinzu.

CONFIG += no_keywords 

Es sagt Qt nicht moc Schlüsselwörter Signale, Schlitze und emittieren, zu definieren, da diese Namen durch eine 3rd-Party-Bibliothek verwendet werden, zum Beispiel Boost. Um dann weiterhin Qt-Signale und Slots mit dem no_keywords-Flag zu verwenden, ersetzen Sie einfach alle Verwendungen der Qt moc-Schlüsselwörter in Ihren Quellen durch die entsprechenden Qt-Makros Q_SIGNALS (oder Q_SIGNAL), Q_SLOTS (oder Q_SLOT) und Q_EMIT.

+0

macht Sinn, scheint aber nicht zu funktionieren. Ich habe gerade versucht CONFIG + = no_keywords, aber es ist eine Veränderung zum schlechteren, ich meine, ich bekomme 114 Fehler. – krusty

+0

@krusty: funktioniert für mich wie ein Charme, http://paste.kde.org/pxebudk7g – lpapp

+0

wahr, das funktioniert, aber ich habe QObjects Klassen in meinem Projekt und scheint es verursacht Probleme. Fügen Sie dem Beispiel eine leere Klasse mit der Basisklasse hinzu, z. QOject http://paste.kde.org/p9qrwvve0 Wenn ich versuche zu bauen, bekomme ich 36 Fehler. Irgendwelche Vorschläge, wie das zu beheben ist? – krusty