在PyQT和Boost.Python之间共享小部件

5

我想知道在PyQt和Boost.Python之间是否可以共享小部件。

我将把Python解释器嵌入到使用Qt的应用程序中。我希望我的应用程序的用户能够将他们自己的UI小部件嵌入到通过Boost.Python公开的C++编程的UI小部件中。

这个可能吗?如何实现?

1个回答

2
我曾尝试为此编写一些代理,但并未完全成功。以下是一个尝试解决此问题的开始,但dir()函数无法正常工作。直接调用函数则有所作用。
这个想法是创建一个额外的Python对象,使用SIP进行包装,如果原始的boost.python对象没有任何匹配的属性,则将任何调用/属性转发到该对象。
不过,我不是足够精通Python的大师,无法使其正常工作。 :(
(我正在将其转换为维基,以便人们可以在此处编辑和更新,因为此代码只是半成品样板。)
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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接