在Qt 5中嵌入Python

9 投票
2 回答
3984 浏览
提问于 2025-04-17 17:06

我想把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>

撰写回答