這是如何整合PyQt4的和boost :: python的一個例子
首先我們必須定義包裝/解包功能來處理裸指針
long int unwrap(QObject* ptr) {
return reinterpret_cast<long int>(ptr);
}
template <typename T>
T* wrap(long int ptr) {
return reinterpret_cast<T*>(ptr);
}
後,我們必須註冊所有類別我們要集成到
class_<QObject, QObject*, boost::noncopyable>("QObject", no_init)
.def("unwrap", unwrap)
.def("wrap", make_function(wrap<QObject>, return_value_policy<return_by_value>()))
.staticmethod("wrap");
class_<QWidget, bases<QObject>, QWidget*, boost::noncopyable>("QWidget")
.def("wrap", make_function(wrap<QWidget>, return_value_policy<return_by_value>()))
.staticmethod("wrap");
class_<QFrame, bases<QWidget>, QFrame*, boost::noncopyable>("QFrame")
.def("wrap", make_function(wrap<QFrame>, return_value_policy<return_by_value>()))
.staticmethod("wrap");
class_<QLabel, bases<QFrame>, QLabel*, boost::noncopyable>("QLabel")
.def("wrap", make_function(wrap<QLabel>, return_value_policy<return_by_value>()))
.staticmethod("wrap");
和例如,我們有一流的,與.. QLabel工作:
class worker: public QObject {
...
void add_label(QLabel*);
};
我們必須將這個類到Python太:現在
class_<worker, bases<QObject>, worker*, boost::noncopyable>("worker")
.def("add_label", &worker::add_label);
我們一個現成的互動,在C++ - 大小做這樣的事情
worker* w = new worker;
main_namespace["worker"] = boost::ref(w);
蟒蛇:
from PyQt4.Qt import *
import sip
import mylib as MyLib
#...
#If you are using QApplication on C++-size you don't need to create another one
lb = QLabel("label from PyQt4!")
lb_ptr = sip.unwrapinstance(f)
my_lb = MyLib.QLabel.wrap(lb_ptr)
worker.add_label(my_lb)
在其他情況下,如果你不想把你自己的Q對象發送給PyQt4:
QLabel* lb = new QLabel("C++ label");
main_namespace["lb"] = boost::ref(lb);
蟒蛇:
from PyQt4.Qt import *
import sip
import mylib as MyLib
#...
my_lb_ptr = lb.unwrap()
qt_lb = sip.wrapinstance(my_lb_ptr, QLabel)
,這是我真正的小幫手:
from PyQt4.Qt import *
import sip
def toQt(object, type):
ptr = object.unwrap()
return sip.wrapinstance(ptr, type)
def fromQt(object, type):
ptr = sip.unwrapinstance(object)
return type.wrap(ptr)
我建議首先嚐試用多重繼承繼承。 – Keith 2011-05-07 20:21:36
如果我是子類,是不是有底層C++ QPoint對象的兩個副本?那麼,在Python中設置成員變量對C++是不可見的,反之亦然? – 2011-05-07 20:25:24
難道你不能只用一個或另一個?或者使用混合類?只是問,我不熟悉Qt和Boost。 – Keith 2011-05-07 20:31:46