使用 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?的主要内容,如果未能解决你的问题,请参考以下文章

如何有效地将数据从 CSV 加载到数据库中?

如何有效地将 Postgres 数据从 Query 传输到 S3

如何有效地将大数据从数据中心移动到 Azure Blob 存储,以便以后通过 HDInsight 进行处理?

如何有效地将树状数据结构插入 postgres

如何有效地将大字符串从 Python 传递到 C++ 扩展方法?

如何在python 3中有效地将原始字节写入numpy数组数据