使用 PySide 时,如何有效地将数据从 NumPy 数组传输到 QPolygonF?
Posted
技术标签:
【中文标题】使用 PySide 时,如何有效地将数据从 NumPy 数组传输到 QPolygonF?【英文标题】:How can I efficiently transfer data from a NumPy array to a QPolygonF when using PySide? 【发布时间】:2013-12-05 20:27:51 【问题描述】:我想在 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()
返回的东西(sip.voidptr
对象)使用 Python 缓冲区协议。
现在的问题是,如果我尝试使用 PySide 而不是 PyQt4 运行上述代码,QPolygonF.data()
只会返回一个QPointF
对象(带有QPolygonF
中第一个点的坐标),因此没用.
所以我的问题是:是否有任何已知的解决方法?如何使用 PySide 将数据放入 QPolygonF
而不插入 QPointF
对象,元素方式?
【问题讨论】:
你试过在 PySide 邮件列表上询问这个吗?在我看来,这就像 PySide 的一个缺陷,应该修复,所以我会在 bug tracker 的邮件列表上发帖,看看是否有人可以提供帮助! 【参考方案1】:这是一种使用 PySide2 将 Numpy 数组写入 QPolygonF 对象指向的内存块的有效方法: https://github.com/PierreRaybaut/PythonQwt/blob/master/qwt/plot_curve.py#L63 (见函数“array2d_to_qpolygonf”)
这与 PyQt4 或 PyQt5 一样高效。
【讨论】:
【参考方案2】:这应该可以工作
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))
希望对你有帮助!
【讨论】:
感谢您的回答。然而,这会将 QPointF 对象元素插入到 QPolygonF 中,这正是我想要规避的。我的应用程序太慢了。 明白了,这让事情变得更有趣了!以上是关于使用 PySide 时,如何有效地将数据从 NumPy 数组传输到 QPolygonF?的主要内容,如果未能解决你的问题,请参考以下文章
如何有效地将 Postgres 数据从 Query 传输到 S3
如何有效地将大数据从数据中心移动到 Azure Blob 存储,以便以后通过 HDInsight 进行处理?