ich eine Bibliothek bin Verpackung, die in C geschrieben wurde ++ zu Python API libwebqqC++ zurück, um die Python-Ebene definiert Rückrufe mit swig Wrapper Aufleg
Es ist eine Art, die in Boost-Funktion definiert ist.
Python-Ebene kann variable Callbacks "EventListener" definieren.
Es gibt auch eine Map-Struktur in C++ - Ebene, die in der Klasse Adapter event_map ist. Der Schlüsseltyp von event_map ist ein QQEvent-Enum-Typ und der Werttyp von event_map ist die Klasse "Action", die EvenListener umschließt.
class Action
{
EventListener _callback;
public:
Action(){
n_actions++;
}
Action(const EventListener & cb){
setCallback(cb);
}
virtual void operator()(std::string data) {
_callback(data);
}
void setCallback(const EventListener & cb){
_callback = cb;
}
virtual ~Action(){ std::cout<<"Destruct Action"<<std::endl; n_actions --; }
static int n_actions;
};
class Adapter{
std::map<QQEvent, Action > event_map;
public:
Adapter();
~Adapter();
void trigger(const QQEvent &event, const std::string data);
void register_event_handler(QQEvent event, EventListener callback);
bool is_event_registered(const QQEvent & event);
void delete_event_handler(QQEvent event);
};
"register_event_handler" in der Klasse Adapter ist die API eine Rückruffunktion zugehöriges Ereignis zu registrieren. Und C++ Back-End wird es aufrufen, wenn Ereignis passiert ist. Aber wir müssen die Callbacks auf Python-Ebene implementieren. Und ich wickelte den Callback-Typen in „callback.i“
Das Problem ist, wenn ich die register_event in Test Python script nenne, immer eine Art Fehler auftritt:
Traceback (most recent call last):
File "testwrapper.py", line 44, in <module>
worker = Worker()
File "testwrapper.py", line 28, in __init__
a.setCallback(self.on_message)
File "/home/devil/linux/libwebqq/wrappers/python/libwebqqpython.py", line 95, in setCallback
def setCallback(self, *args): return _libwebqqpython.Action_setCallback(self, *args)
TypeError: in method 'Action_setCallback', argument 2 of type 'EventListener const &'
Destruct Action
Bitte helfen, die Wurzel, um herauszufinden, Ursache für diesen Typ Fehler und eine Lösung für dieses Problem.
http://stackoverflow.com/questions/12392703/what-is-the-cleanest-way-to-call-a-python-function-from-c-with-a-swig-wrapped – xmduhan