在Qt 5中嵌入Python3
我想把Python 3.4嵌入到一个Qt 5.2.1的应用程序中(64位)。不过我在构建的时候遇到了一些问题,也就是说,当我在main.cpp文件中包含Python的头文件时,它可以正常编译。
#include <python.h>
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
但是当我把它放在其他地方(在Qt的头文件之后)时,
//
// embedpytest.cpp
//
#include <QLibrary>
#include <python.h>
EmbedPyTest::EmbedPyTest()
{
}
就会出现编译错误:
C:\Python34\include\object.h:435: error: C2059: syntax error : ';'
C:\Python34\include\object.h:435: error: C2238: unexpected token(s) preceding ';'
这个问题和另一个很相似,但那个解决方案并不管用。
有没有人知道怎么解决这个问题?或者能不能给出一些简单的变通办法,让python.h和Qt5能够和谐共存呢?
2 个回答
为了避免在使用“slots”这个词时出现冲突,而不需要关闭像signals、slots、emit这些关键词(对于大型Qt项目来说,这可能不是个好主意),可以采取一种方法,就是在包含Python.h的时候,暂时“停用”这个关键词,然后再重新使用它。具体做法是,把每次出现的 #include "Python.h"
替换成下面的代码块:
#pragma push_macro("slots")
#undef slots
#include "Python.h"
#pragma pop_macro("slots")
或者,更方便的做法是把上面的代码放到一个单独的头文件里,比如叫 Python_wrapper.h
,然后把所有的 #include "Python.h"
替换成 #include "Python_wrapper.h"
。
出问题的那一行是:
PyType_Slot *slots; /* terminated by slot==0. */
问题在于,这一行中,“slots”在Qt里是一个默认的关键字。为了在其他项目中使用这个变量名,你需要在你的项目文件里加上这一行:
CONFIG += no_keywords
详细信息可以查看文档:
在Qt中使用第三方信号和槽
你可以在Qt中使用第三方的信号/槽机制。甚至可以在同一个项目中同时使用这两种机制。只需在你的qmake项目(.pro)文件中添加以下一行。
CONFIG += no_keywords
这行代码告诉Qt不要定义moc关键字signals、slots和emit,因为这些名字会被第三方库使用,比如Boost。然后,为了继续使用Qt的信号和槽,并且使用no_keywords标志,只需在你的源代码中将所有Qt的moc关键字替换为相应的Qt宏Q_SIGNALS(或Q_SIGNAL)、Q_SLOTS(或Q_SLOT)和Q_EMIT。