2013-02-25 63 views
6

我想將Python解釋器嵌入到Qt 5應用程序中。在Qt 5中嵌入Python

我在Qt的5工作的應用程序,但是,當我把

#include <Python.h> 

在頂部(以下Qt的報頭)的彙編場所與

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

當我把Python的報頭中的Qt的上述它打破的標頭

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. 

請問,有沒有人知道爲什麼會發生這種情況?我可能是因爲Qt和Python定義了一些常見詞彙?我能做些什麼呢?

回答

6

發生這種情況是因爲包含Python.h第一個間接包含termios.h,它將B0定義爲0,這反過來qpagedpaintdevice.h想要用作變量名稱。在Qt包含之後加入Python.h與字符串'slots'相反。

我建議按以下順序:

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

到接受的答案的選擇:

由於Qt使用的slots作爲保留關鍵字有與的的slots成員的聲明衝突PyType_Spec結構在Python API中。

可以指示Qt不使用正常的moc關鍵字,這將消除衝突。這是通過將以下內容添加到項目文件中完成的: CONFIG += no_keywords

缺點是您需要引用相應的Qt宏而不是先前的關鍵字。

因此,下面的替代將需要Qt的側: signals -> Q_SIGNALS slots -> Q_SLOTS emit -> Q_EMIT

這在上信號和槽Qt的文檔上的部分Using Qt with 3rd Part Signals and Slots說明。

PS:在開始一個新項目時,這通常是一個很好的選擇,而不是在將Python添加到廣泛使用Qt關鍵字的現有代碼庫時。