2

我正在尝试使用 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();

我假设 Python 中使用 ctypes 的等效代码应该是:

num = ctypes.c_int()
myobj.dynamicCall('GetNumHWUnits(int, int&)', [6, ctypes.byref(num)])

num永远不会更新。

Python 中的等效代码或解决方法是什么,以及如何int&使用 Python 发送和稍后读取类型的参数?

4

3 回答 3

2

你可以尝试传递一个只有一个元素的列表:

def funct(a):
    a[0] = 4

b = [3]
funct(b)
print b[0]

输出:4

于 2014-08-20T07:14:06.130 回答
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, calldynamicCall中。在通话期间,新QVariant的会更新,但与原始的没有连接,c_int因此您的实例不会更改。

这应该有效:

num = QVariant(0)
myobj.dynamicCall('GetNumHWUnits(int, int&)', [6, num])
print repr(num.value())
于 2014-08-20T13:03:30.487 回答
1

从 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]

这篇文章中显示了一个完整的代码示例。

于 2014-08-21T08:03:51.977 回答