在Qt的5嵌入的Python(Embedding Python in Qt 5)

2019-08-17 03:55发布

我想嵌入Python解释器中一个Qt 5应用程序。

我在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定义一些常用词? 我能做些什么呢?

Answer 1:

这是因为包括Python.h第一间接包含termios.h,它定义B0为0,这反过来又要qpagedpaintdevice.h对作为变量名使用。 包括Python.h Qt的包括后各地做几乎同样的事情的其他方式使用字符串“插槽”。

我建议按以下顺序:

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


Answer 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的文档解释使用Qt与第三部分信号和槽 。

PS:开始一个新项目时,还不时加入Python来使用Qt的现有代码基础广泛的关键字这通常是一个不错的选择。



文章来源: Embedding Python in Qt 5