1

我是 Python/SIP 的新手,需要使用它为 Qt/C++ 库创建 Python 绑定。

类标题如下所示:

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 列表,但这不起作用(与上面 Python 中的 TypeError 相同)。

提前致谢。


更新 - 我找到了一个解决方案/解决方法:

data(QVector<quint16> *data)信号被一个没有参数的信号所取代,例如dataAvailable(). 然后添加一个公共方法 likeQVector<quint16> *getData()来传输数据。保留定义(正如我之前已经尝试过的%MappedType QVector<quint16>那样)并将返回类型转换为 Python PyObject *。但是,这适用于方法的返回值,getData()但不适用于信号参数。

在 Python 中,只需将信号连接dataAvailable()到一个插槽并getData()从该插槽内调用。

因此,数据必须在MyClass.

4

0 回答 0