2013-02-25 39 views
6

Tôi muốn nhúng trình thông dịch Python vào ứng dụng Qt 5.Nhúng Python vào Qt 5

Tôi có một ứng dụng làm việc trong Qt 5 nhưng khi tôi đặt

#include <Python.h> 

ở phía trên (dưới tiêu đề Qt) vỡ biên soạn với

../sample/python3.3m/object.h:432:23: error: expected member name or ';' after declaration specifiers 
PyType_Slot *slots; /* terminated by slot==0. */ 
~~~~~~~~~~~  ^

Khi tôi đặt Python tiêu đề phía trên Qt tiêu đề bị ngắt với

In file included from ../Qt5.0.1/5.0.1/clang_64/include/QtGui/QtGui:59: 
../Qt5.0.1/5.0.1/clang_64/include/QtGui/qpagedpaintdevice.h:63:57: error: expected '}' 
        A0, A1, A2, A3, A5, A6, A7, A8, A9, B0, B1, 
                 ^
/usr/include/sys/termios.h:293:12: note: expanded from macro 'B0' 
#define B0  0 
       ^
../Qt5.0.1/5.0.1/clang_64/include/QtGui/qpagedpaintdevice.h:62:19: note: to match this '{' 
    enum PageSize { A4, B5, Letter, Legal, Executive, 
       ^
1 error generated. 

Xin vui lòng, không ai biết tại sao điều này xảy ra? Tôi có thể là vì Qt và Python xác định một số từ phổ biến? Tôi có thể làm gì với nó?

Trả lời

6

Điều này xảy ra vì bao gồm Python.h gián tiếp đầu tiên bao gồm termios.h, định nghĩa B0 là 0, theo đó qpagedpaintdevice.h muốn sử dụng làm tên biến. Bao gồm Python.h sau khi Qt bao gồm thực hiện khá nhiều điều tương tự theo cách khác xung quanh với chuỗi 'khe'.

Tôi đề nghị theo trình tự sau:

#include <Python.h> 
#undef B0 
#include <QWhatEver> 
2

Một thay thế cho câu trả lời được chấp nhận:

Kể từ khi Qt sử dụng slots như một từ khóa dành riêng có một cuộc đụng độ với việc kê khai của slots thành viên của PyType_Spec struct trong API Python.

Qt có thể được hướng dẫn để không sử dụng từ khóa moc bình thường và điều này sẽ loại bỏ xung đột. Điều này được thực hiện bằng cách thêm những điều sau vào tệp dự án của bạn: CONFIG += no_keywords

Hạn chế là bạn sẽ cần phải tham khảo các macro Qt tương ứng thay vì các từ khóa trước đó.

Do đó, thay thế sau đây sẽ là cần thiết cho phía Qt: signals -> Q_SIGNALS slots -> Q_SLOTS emit -> Q_EMIT

này được giải thích trong tài liệu Qt trên tín hiệu và khe cắm trên phần Using Qt with 3rd Part Signals and Slots.

PS: Đây thường là tùy chọn tốt khi bắt đầu dự án mới, không phải khi thêm Python vào cơ sở mã hiện có sử dụng từ khóa Qt rộng rãi.