[英]Embedding Python3 in Qt 5
我想將 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 可以從此幸福地生活在一起?
另一種避免“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 與第 3 方信號和插槽一起使用
可以將 Qt 與第 3 方信號/插槽機制一起使用。 您甚至可以在同一個項目中使用這兩種機制。 只需將以下行添加到您的 qmake 項目 (.pro) 文件中。
CONFIG += no_keywords
它告訴 Qt 不要定義 moc 關鍵字信號、插槽和發射,因為這些名稱將被 3rd 方庫使用,例如 Boost。 然后要繼續使用帶有 no_keywords 標志的 Qt 信號和槽,只需將源中 Qt moc 關鍵字的所有使用替換為相應的 Qt 宏 Q_SIGNALS(或 Q_SIGNAL)、Q_SLOTS(或 Q_SLOT)和 Q_EMIT。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.