我想知道是否可以在 PyQt 和 Boost.Python 之间共享小部件。
我将在我的一个使用 Qt 的应用程序中嵌入一个 Python 解释器。我希望我的应用程序的用户能够将他们自己的 UI 小部件嵌入到用 C++ 编程并通过 Boost.Python 公开的 UI 小部件中。
这是可能的吗?人们将如何去做呢?
我想知道是否可以在 PyQt 和 Boost.Python 之间共享小部件。
我将在我的一个使用 Qt 的应用程序中嵌入一个 Python 解释器。我希望我的应用程序的用户能够将他们自己的 UI 小部件嵌入到用 C++ 编程并通过 Boost.Python 公开的 UI 小部件中。
这是可能的吗?人们将如何去做呢?
我试图为此编写一些代理,但我还没有完全成功。这是一个试图解决这个问题的开始,但 dir() 不起作用。直接调用函数有点作用。
这个想法是创建一个附加在 SIP 中的 python 对象,如果原始 boost.python 对象没有任何匹配的属性,则将任何调用/属性转发给该对象。
不过,我还不足以让 Python 大师正常工作。:(
(我正在把它变成一个 wiki,所以 ppl 可以在这里编辑和更新,因为这段代码只是半生不熟的样板。)
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)