J'ai essayé d'écrire un proxy pour cela, mais je n'ai pas réussi complètement. Voici un début qui essaye de résoudre ceci, mais le dir() ne fonctionnera pas. L'appel de fonctions fonctionne directement un peu.
L'idée était de créer un objet python supplémentaire enveloppé dans SIP et de transmettre tous les appels/attributs à cet objet si l'objet boost.python d'origine n'avait aucun attribut correspondant. Cependant, je ne suis pas assez gourou Python pour que cela fonctionne correctement. :(
(. Je tourne cela en un wiki, donc ppl pouvez modifier et mettre à jour ici, car ce code est juste boilerplate demi-cuit)
C++:
#include "stdafx.h"
#include <QtCore/QTimer>
class MyWidget : public QTimer
{
public:
MyWidget() {}
void foo() { std::cout << "yar\n"; }
unsigned long myself() { return reinterpret_cast<unsigned long>(this); }
};
#ifdef _DEBUG
BOOST_PYTHON_MODULE(PyQtBoostPythonD)
#else
BOOST_PYTHON_MODULE(PyQtBoostPython)
#endif
{
using namespace boost::python;
class_<MyWidget, bases<>, MyWidget*, boost::noncopyable>("MyWidget").
def("foo", &MyWidget::foo).
def("myself", &MyWidget::myself);
}
Python:
from PyQt4.Qt import *
import sys
import sip
from PyQtBoostPythonD import * # the module compiled from cpp file above
a = QApplication(sys.argv)
w = QWidget()
f = MyWidget()
def _q_getattr(self, attr):
if type(self) == type(type(MyWidget)):
raise AttributeError
else:
print "get %s" % attr
value = getattr(sip.wrapinstance(self.myself(), QObject), attr)
print "get2 %s returned %s" % (attr, value)
return value
MyWidget.__getattr__ = _q_getattr
def _q_dir(self):
r = self.__dict__
r.update(self.__class__.__dict__)
wrap = sip.wrapinstance(self.myself(), QObject)
r.update(wrap.__dict__)
r.update(wrap.__class__.__dict__)
return r
MyWidget.__dir__ = _q_dir
f.start()
f.foo()
print dir(f)