在Qt 5中嵌入Python

时间:2014-04-14 19:33:34

标签: python c++ qt qmake qt-signals

我想将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 ';'

enter image description here

这与此问题非常相似,但解决方案无效

Embedding Python in Qt 5

任何人都知道如何解决这个问题?或建议一些干净的解决方法,以便python.h和Qt5 之后能幸福地生活在一起吗?

2 个答案:

答案 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"