8

PythonインタープリターをQt5アプリケーションに組み込みたいと思います。

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がいくつかの一般的な単語を定義しているからかもしれませんか?私はそれについて何ができますか?

4

2 に答える 2

7

これは、Python.hを含めると、最初に間接的にtermios.hが含まれ、B0を0として定義し、qpagedpaintdevice.hが変数名として使用するために発生します。Qtインクルードの後に​​Python.hをインクルードすると、文字列'slots'とほぼ同じことが逆になります。

次の順序をお勧めします。

#include <Python.h>
#undef B0
#include <QWhatEver>
于 2013-02-25T23:39:35.937 に答える
5

受け入れられた答えの代替案:

Qtはslots予約キーワードとしてを使用するため、 PythonAPIslotsの構造体のメンバーの宣言と衝突します。PyType_Spec

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

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

したがって、Qt側には次の交換が必要になります。 signals -> Q_SIGNALS slots -> Q_SLOTS emit -> Q_EMIT

これは、セクション「サードパーティのシグナルとスロットでのQtの使用」のシグナルとスロットに関するQtドキュメントで説明されています。

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

于 2017-05-23T06:43:08.090 に答える