我想在PyQt4/PySide应用程序中绘制带有许多控制点的折线。点坐标来自NumPy数组,必须将其放入QPolygonF中才能使用QPainter.drawPolyline(...)进行绘制。

使用PyQt4,可以高效地完成此操作,例如与这样的事情:

import numpy as np
from PyQt4.QtGui import *

n = 3
qpoints = QPolygonF(n)
vptr = qpoints.data()
vptr.setsize(8*2*n)
aa = np.ndarray( shape=(n,2), dtype=np.float64, buffer=buffer(vptr))
aa.setflags(write=True)
aa[:,0] = np.arange(n)
aa[:,1] = np.arange(n)
for i in range(n):
    print qpoints.at(i)

这行得通,因为在使用PyQt4时,QPolygonF.data()返回某种表示Python缓冲区协议(protocol)的内容(一个sip.voidptr对象)。

现在的问题是,如果我尝试使用PySide而不是PyQt4运行以上代码,QPolygonF.data()只会返回QPointF对象(带有QPolygonF中第一点的坐标),因此是无用的。

所以我的问题是:对此有任何已知的解决方法吗?如何使用PySide将数据放入QPolygonF中,而又不逐元素地插入QPointF对象?

最佳答案

这应该工作

from pylab import *
from PySide.QtGui import QPolygonF
from PySide.QtCore import QPointF

xy = resize(arange(10),(2,10)).T

qPlg = QPolygonF()
for p in xy:
    qPlg.append(QPointF(*p))

希望能帮助到你!

关于python - 使用PySide时,如何有效地将数据从NumPy数组传输到QPolygonF?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20119777/

10-12 21:46