在Qt 5中嵌入Python
我想把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定义了一些相同的词吗?我该怎么解决这个问题呢?
2 个回答
8
这是一个替代方案,针对之前的答案:
因为Qt把slots
当作保留字使用,所以在Python API中,PyType_Spec
结构体里的slots
成员会产生冲突。
你可以让Qt不使用普通的moc关键字,这样就能避免这个冲突。方法是在你的项目文件中添加以下内容:
CONFIG += no_keywords
不过这样做的缺点是,你需要用Qt的宏来代替之前的关键字。
所以在Qt方面,你需要做以下替换:
signals -> Q_SIGNALS
slots -> Q_SLOTS
emit -> Q_EMIT
关于这个问题,可以在Qt的文档中找到解释,特别是在关于信号和槽的部分,链接是 使用Qt与第三方信号和槽。
补充说明:这个方法通常适合在开始新项目时使用,而不适合在已有大量使用Qt关键字的代码基础上添加Python。
8
这个问题发生的原因是,因为先包含了 Python.h,间接地又包含了 termios.h,而 termios.h 中把 B0 定义为 0。接着,qpagedpaintdevice.h 想用这个名字作为变量名。相反,如果在 Qt 的包含文件之后再包含 Python.h,基本上也会出现类似的问题,只不过是字符串 'slots'。
我建议按照以下顺序来包含文件:
#include <Python.h>
#undef B0
#include <QWhatEver>