2009-09-17 12 views
3

Je me demandais s'il était possible de partager des widgets entre PyQt et Boost.Python.Partager des widgets entre PyQT et Boost.Python

Je vais incorporer un interpréteur Python dans une application qui utilise Qt. Je voudrais que les utilisateurs de mon application puissent intégrer leurs propres widgets de l'interface utilisateur dans les widgets UI programmés en C++ et exposés via Boost.Python. Est-ce possible et comment y arriver?

Répondre

2

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) 
Questions connexes