将pyqt对象传递给swig导出的c ++代码

时间:2011-05-23 20:54:25

标签: c++ pyqt swig

任何人都知道是否存在将pyQt对象传递给c ++代码的方法?

我会更好地解释;说我有这个c ++代码

    void QtGuiPDLVisitor::set_layout(QLayout* _layout){
       layout = _layout;
    }

其中QtGuiPDLVisitor是使用SWIG在python中导出的c ++类,所以在python中我想做类似这样的事情

    layout = QtGui.QGridLayout()
    visitor = QtGuiPDLVisitor()
    visitor.set_layout(layout)

有可能吗? python解释器说不:(有什么解决方法,比如传递指针或任何其他黑客的方法吗?

编辑:

Traceback (most recent call last):
  File "/home/picci/workspace/gestface/pypelab/src/pypelab/ui/pipeworkarea.py", line 53, in create_new_computation
    subWindowWidget.setComputation(idx.data())
  File "/home/picci/workspace/gestface/pypelab/src/pypelab/ui/pypeWidgets.py", line 44, in setComputation
    self.widBuilder.buildUi(self)
  File "/home/picci/workspace/gestface/pypelab/src/pypelab/ui/pypeWidgets.py", line 63, in buildUi
    pdlVisitor.set_layout(criteria_area_layout)
  File "/home/picci/workspace/gestface/pipeit/wrap/python/dist/Debug/pipeit.py", line 736, in set_layout
    def set_layout(self, *args) -> "void" : return _pipeit.QtGuiPDLVisitor_set_layout(self, *args)
TypeError: in method 'QtGuiPDLVisitor_set_layout', argument 2 of type 'QLayout *'

这是python的错误。我已经知道这个错误是由于Qt4是使用SIP在python中包装的事实,而我正在使用SWIG来包装,但我认为必须有一种方法可以直接访问Qlayout对象的指针并传递它来自python的C ++代码。

1 个答案:

答案 0 :(得分:0)

好的,我确实找到了一种方法。我用了

visitor.set_layout_address(sip.unwrapinstance(layout))

来自python,而不是来自c ++

void QtGuiPDLVisitor::set_layout_address(long _layout_address){
    layout = reinterpret_cast<QLayout*>(_layout_address);
}

并且工作了!

此处sip doc了解有关sip.unwrapinstance()

的更多信息