2014-04-14 20 views
5

Chciałbym osadzić interpreter Python 3.4 w aplikacji Qt 5.2.1 (64-bitowej). Mam jednak problemy z budowaniem, mam na myśli, gdy dołączam nagłówek Pythona do main.cpp, który kompiluje się dobrze.Osadzanie Pythona3 w 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(); 
} 

ale kiedy umieścić go w innym miejscu (po nagłówkach Qt)

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


EmbedPyTest::EmbedPyTest() 
{ 
} 

otrzymuję błędy kompilacji:

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

Jest bardzo podobny problem do tego , ale rozwiązanie nie działa

Embedding Python in Qt 5

Ktoś wie, jak rozwiązać ten problem? lub zasugerować jakieś czyste obejście, aby python.h i Qt5 mogły żyć razem długo i szczęśliwie?

+0

Jak ta odpowiedź nie zadziałała? Ponieważ działało dla mnie z dokładnie taką samą wersją Python i Qt jak ty. – cmannett85

+0

wydaje się niemożliwe. Używam 64-bitowego pythona 3.4, 64-bitowego Qt 5.2.1 i wizualnego studio 2012 – krusty

+0

Użyłem g ++, być może to była różnica. – cmannett85

Odpowiedz

3

Linia wykraczająca to:

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

Problemem jest to, że z tej linii, „Szczeliny” jest słowem kluczowym domyślnie w Qt. W celu korzystania z tej nazwy zmiennej w innych projektach, trzeba będzie użyć tego w pliku projektu:

CONFIG += no_keywords 

Szczegółowe informacje można znaleźć w documentation:

Korzystanie z Qt z 3rd party mechanizm sygnałów i slotów

Możliwe jest użycie Qt z mechanizmem sygnału/gniazda innej firmy. Możesz nawet użyć obu mechanizmów w tym samym projekcie. Wystarczy dodać następującą linię do pliku projektu qmake (.pro).

CONFIG += no_keywords 

Mówi Qt nie zdefiniować moc słowa kluczowe sygnały, gniazda i emitują, ponieważ nazwy te będą wykorzystane przez 3rd biblioteki partii, np Podnieść. Aby dalej używać sygnałów Qt i gniazd z flagą no_keywords, po prostu zamień wszystkie zastosowania słów kluczowych Qt moc w twoich źródłach za pomocą odpowiednich makr Qt Q_SIGNALS (lub Q_SIGNAL), Q_SLOTS (lub Q_SLOT) i Q_EMIT.

+0

ma sens, ale nie działa. Właśnie wypróbowałem CONFIG + = no_keywords, ale to jest zmiana na gorsze, co oznacza, że ​​dostaję 114 błędów. – krusty

+0

@krusty: działa dla mnie jak urok, http://paste.kde.org/pxebudk7g – lpapp

+0

prawda, że ​​działa, ale mam klasy QObject w moim projekcie i wydaje się, że powoduje problemy. Dodaj do przykładu pustą klasę z klasą podstawową, np. QOject http://paste.kde.org/p9qrwvve0 Podczas próby zbudowania pojawia się błąd 36. Wszelkie sugestie, jak to naprawić? – krusty