Я делаю библиотеку c ++ с SIP, чтобы использовать ее в коде Python.
Моя проблема в том, что мне не удается передать объект Python QString в библиотечные функции C ++.
Каждый вызов функции C ++ с использованием QString приводит к краху Python.
Сбой не появляется при выполнении функции, но перед запуском первого шага функции. (Поэтому я не помещаю файл cpp здесь)
Вот что я делаю:
Класс C ++:
#include "QString"
Class CPythInteface
{
public:
CPythInteface ();
// Trying a lot of prototypes:`
bool testSET( const QString* cSource);
bool testGET( QString* Source );
bool testGET2( QString& Source );
bool testGET3( char* zBuff );
bool testGET4( QString Source );
bool testSET4( QString Source );
QString getS1( const char* zVal );
};
—
SIP-файл:
%Module libtest 1
%Import QtCore/QtCoremod.sip
class CPythInteface
{
%TypeHeaderCode
#include "CPythInteface.h"%End
public:
CPythInteface ();
bool testSET( const QString* );
bool testGET( QString* );
bool testGET2( QString& );
bool testGET3( char* );
bool testGET4( QString Source );
bool testSET4( QString Source );
QString getS1( const char* zVal );
};
—
Использование Python:
>>> import libtest
>>> obj = libtest. CPythInteface()
>>> from PyQt4 import QtCore
>>> qs1 = QtCore.QString( "abc" )
>>> obj.testGET3( "azertyuiop" ) <-- OK
>>> obj.testXXX( qs1 ) <-- Crashes for all
functions SET/GET
.
Я делаю что-то неправильно ? Разве не следует использовать Python и C ++?
—
Еще один тест с вышеуказанной инициализацией:
>>> qs1 += obj.getS1( "azert" )
выдает ошибку:
TypeError: невозможно объединить объекты ‘QString’ и ‘ProcessError’
Похоже, это показывает, что QString из библиотеки C ++ неправильно понимается Python.
В случае, если это кого-то заинтересует, я обнаружил, что проблема определенно была в том, что PyQt был предоставлен с Qt 4.9.2 (это не публичная версия), хотя моя библиотека C ++ была связана с Qt 4.6.3.
Других решений пока нет …