Расширение Python SIP для Qt C++: как обработать аргумент сигнала QVector

Я новичок в 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,

0 ответов

Другие вопросы по тегам