我是 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
.