Я новичок в Python / SIP и мне нужно создать привязку Python для библиотеки Qt / C ++, используя ее.
Заголовок класса выглядит так:
class MyClass : public QObject {
Q_OBJECT
...
signals:
void message(QString msg);
void data(QVector<quint16> *data);
...
};
Это соответствующий файл спецификации SIP:
%Module myclassPy
%Import QtCore/QtCoremod.sip
class MyClass : public QObject
{
%TypeHeaderCode
#include "myclass.h"%End
...
signals:
void message(QString msg);
void data(QVector<quint16> *data);
};
Импорт модуля Python и подключение message
Сигнал к слоту Python (используя PyQt5) работает как шарм.
Тем не менее, подключение data
сигнал не работает: TypeError: C++ type 'QVector<quint16>' is not supported as a signal argument type
,
Поэтому мне нужно преобразовать аргумент QVector (указатель) сигнала в объект Python (возможно, список).
Каков наилучший способ сделать это с SIP?
Нужно ли указывать новый сигнал с аргументом типа Python?
Я уже пытался с помощью %MappedType QVector<quint16>
определение для преобразования его в список Python, но это не сработало (та же ошибка TypeError, что и выше в Python).
Заранее спасибо.
ОБНОВЛЕНИЕ — я вроде нашел решение / обходной путь:
data(QVector<quint16> *data)
сигнал заменен сигналом без аргумента, например, dataAvailable()
, Тогда публичный метод, как QVector<quint16> *getData()
добавлен для передачи данных. %MappedType QVector<quint16>
определение сохраняется (как я уже пробовал раньше) и преобразует возвращаемый тип в Python PyObject *
, Тем не менее, это работает с возвращаемым значением getData()
метод, но не с аргументами сигнала.
В Python просто подключите сигнал dataAvailable()
в слот и позвонить getData()
из этого слота.
Поэтому данные должны быть буферизованы где-то в пределах MyClass
,
Задача ещё не решена.
Других решений пока нет …