我想将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 之后能幸福地生活在一起吗?
答案 0 :(得分:6)
违规行是:
PyType_Slot *slots; /* terminated by slot==0. */
问题在于,使用此行,&#34; slot&#34;在Qt中默认是关键字。要在其他项目中使用该变量名,您需要在项目文件中使用它:
CONFIG += no_keywords
有关详细信息,请参阅documentation:
将Qt与第三方信号和插槽一起使用
可以将Qt与第三方信号/插槽机制一起使用。您甚至可以在同一个项目中使用这两种机制。只需将以下行添加到qmake项目(.pro)文件中即可。
CONFIG += no_keywords
它告诉Qt不要定义moc关键字信号,插槽和发射,因为这些名称将被第三方库使用,例如:促进。然后继续使用带有no_keywords标志的Qt信号和插槽,只需将源中Qt moc关键字的所有使用替换为相应的Qt宏Q_SIGNALS(或Q_SIGNAL),Q_SLOTS(或Q_SLOT)和Q_EMIT。
答案 1 :(得分:6)
另一种避免与'slot'冲突的方法是to locally "park" the offending keyword while Python.h is included, and then reassign it,而不需要停用关键字signals / slots / emit(这对大型Qt项目来说可能是不合需要的)。要实现此目的,请使用以下块替换每个#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"
。