передача объекта pyqt в swig-экспортированный код c

#c #pyqt #swig

#c #pyqt #swig

Вопрос:

кто-нибудь знает, существует ли метод для передачи объектов PyQt в код c ?

Я объясню лучше; скажем, у меня есть этот код c

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

где QtGuiPDLVisitor — это класс c , экспортируемый в python с использованием SWIG, поэтому в 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 является оболочкой в python с использованием SIP, в то время как я использую SWIG для переноса, но я думаю, что должен быть способ получить прямой доступ к указателю объекта Qlayout и передать его в код C из python.

Комментарии:

1. SWIG должен заставить работать именно этот код Python. Он выполнит преобразование указателей за вас. Вы говорите, что интерпретатор Python выдает вам ошибку, так почему же вы ее не опубликовали?

Ответ №1:

Хорошо, я действительно нахожу способ сделать это. Я использовал

 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()