簡體   English   中英

在 Qt 5 中嵌入 Python3

[英]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 ';'

在此處輸入圖片說明

這與這個問題非常相似,但解決方案不起作用

在 Qt 5 中嵌入 Python

有誰知道如何解決這個問題? 或者建議一些干凈的解決方法,以便 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM