使用PySide时,如何有效地将数据从NumPy数组传输到QPolygonF?

时间:2013-11-21 11:29:59

标签: python numpy pyqt pyqt4 pyside

我想在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缓冲区协议的内容(sip.voidptr对象)。

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

所以我的问题是:这有什么已知的解决方法吗?如何使用PySide将数据放入QPolygonF而不插入QPointF个对象,以元素方式?

2 个答案:

答案 0 :(得分:0)

这应该有效

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))

希望它有所帮助!

答案 1 :(得分:0)

这是使用PySide2将Numpy数组写入QPolygonF对象指向的内存块的有效方法: https://github.com/PierreRaybaut/PythonQwt/blob/master/qwt/plot_curve.py#L63 (请参见函数“ array2d_to_qpolygonf”)

这与PyQt4或PyQt5一样高效。