我正在尝试使用PyQt与Python中的ActiveX COM对象进行通信。此方法适用于Python:
myobj.dynamicCall('SetAbsMovePos(int, double)', [0, 10])
但是,我不能通过引用发送参数。从文档中,我想称的方法是:
int GetNumHWUnits (int lHWType, int& plNumUnits)
,基本示例代码为:
QVariantList params = ...
int result = object->dynamicCall("GetNumHWUnits(int, int&)", params).toInt();
我假设使用ctypes的Python中的等效代码应该是:
num = ctypes.c_int()
myobj.dynamicCall('GetNumHWUnits(int, int&)', [6, ctypes.byref(num)])
但num
永远不会更新。
Python中的等效代码或解决方法是什么,以及如何使用Python发送并稍后读取类型int&
的参数?
答案 0 :(得分:1)
您可以尝试仅使用一个元素传递列表:
def funct(a):
a[0] = 4
b = [3]
funct(b)
print b[0]
输出:4
答案 1 :(得分:1)
QVariant
:
QVariant dynamicCall(const char *, QList<QVariant> & /GetWrapper/);
%MethodCode
Py_BEGIN_ALLOW_THREADS
sipRes = new QVariant(sipCpp->dynamicCall(a0, *a1));
Py_END_ALLOW_THREADS
// Update the input list with the (possibly) new values.
for (SIP_SSIZE_T i = 0; i < PyList_GET_SIZE(a1Wrapper); ++i)
{
QVariant *v = new QVariant(a1->at(i));
PyObject *v_obj = sipConvertFromNewType(v, sipType_QVariant, NULL);
简而言之,QVariant
是一个通过引用传递值的包装器。
这意味着通过传递c_int
,您将值包装两次。尝试传递真实QVariant
而不是c_int
作为第二个参数。如果没有这个,PyQt中的自动类型强制将使用c_int
,将其值包装在QVariant
中,调用dynamicCall
。在通话过程中,新的QVariant
已更新,但与原c_int
没有任何关联,因此您的实例不会发生变化。
这应该有效:
num = QVariant(0)
myobj.dynamicCall('GetNumHWUnits(int, int&)', [6, num])
print repr(num.value())
答案 2 :(得分:0)
从PyQt邮件列表中获得解决方案。需要引用参数列表,因为只更新了该列表;原始的QVariant对象永远不会。回想起来似乎相当明显!
typ = QVariant(6)
num = QVariant(0)
args_list = [typ, num]
self.dynamicCall('GetNumHWUnits(int, int&)', args_list)
print 'Num of HW units =', args_list[1].toInt()[0]
完整的代码示例显示在this post。
中