2013-02-25 17 views
6

に私はQtの5アプリケーションにPythonインタプリタを埋め込むしたいと思います。埋め込みPythonはQtの5

Iが上部に

#include <Python.h> 

を入れたときに、私はQtの上にPythonのヘッダを置く

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

とコンパイル切断(Qtのヘッダの下)のQt 5における作業アプリケーションを有するがヘッダーが壊れます

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が最初に間接的にターンqpagedpaintdevice.hでの変数名として使用する0にB0を定義termios.hを、含まれているため、これが発生します。 Qtは含まれて後はPython.h含めると、文字列「スロット」で他の方法で回避ほとんど同じことを行います。

私は、次の順序提案:Qtは予約キーワードとしてslotsを使用しているためのslotsメンバーの宣言との衝突がある

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

に受け入れ答えの代わりにPythonのAPIでPyType_Spec構造体。

Qtは、通常のMOCキーワードを使用しないように指示することができ、これは衝突を削除します。これは、あなたのプロジェクトファイルに以下を追加することによって行われます。 CONFIG += no_keywords

欠点は、以前のキーワードの代わりに対応するQtマクロを参照する必要があることです。

したがって、以下の置換は、Qtの側に必要とされるであろう。 signals -> Q_SIGNALS slots -> Q_SLOTS emit -> Q_EMIT

これはセクションUsing Qt with 3rd Part Signals and Slots上の信号と​​スロットにQtのドキュメントで説明されています。

PS:これは、新しいプロジェクトを開始するとき、通常は良いオプションです、ないQtが広範囲にキーワード使用する既存のコードベースにはPythonを追加するとき。

関連する問題