Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PyQT和Boost.Python之间共享小部件_Python_Qt_Pyqt_Boost Python_Python Sip - Fatal编程技术网

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

在PyQT和Boost.Python之间共享小部件,python,qt,pyqt,boost-python,python-sip,Python,Qt,Pyqt,Boost Python,Python Sip,我想知道是否有可能在PyQt和Boost.Python之间共享小部件 我将在我使用Qt的应用程序中嵌入一个Python解释器。我希望我的应用程序的用户能够嵌入自己的UI部件到C++编程的UI部件中,并通过Boojy.python。 这是可能的吗?我们该怎么做呢?我已经试着为此编写了一些代理,但还没有完全成功。这里有一个尝试解决这个问题的开始,但是dir()不起作用。直接调用函数在某种程度上起作用 其想法是创建一个附加的python对象,该对象封装在SIP中,如果原始boost.python对象没

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

我将在我使用Qt的应用程序中嵌入一个Python解释器。我希望我的应用程序的用户能够嵌入自己的UI部件到C++编程的UI部件中,并通过Boojy.python。
这是可能的吗?我们该怎么做呢?

我已经试着为此编写了一些代理,但还没有完全成功。这里有一个尝试解决这个问题的开始,但是dir()不起作用。直接调用函数在某种程度上起作用

其想法是创建一个附加的python对象,该对象封装在SIP中,如果原始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);
} 
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)