【发布时间】:2011-01-11 12:04:12
【问题描述】:
在 PyQT 中,如何在给定点绘制小“节点”并将它们与边缘连接?我找到的所有 PyQT 教程都是“绘制一个按钮!绘制一个复选框!”
【问题讨论】:
在 PyQT 中,如何在给定点绘制小“节点”并将它们与边缘连接?我找到的所有 PyQT 教程都是“绘制一个按钮!绘制一个复选框!”
【问题讨论】:
如果您希望能够与图中显示的对象进行交互,最好使用QGraphicsScene。它处理缩放和平移,并且可以包含其他可以处理自己的交互的QGraphicsItem 对象。
它非常易于使用,但会产生一些开销,尤其是当您计划制作数千个对象时。
您可以找到 PyQt 教程here。这和 API 文档应该可以帮助您入门。
【讨论】:
很难找到一个好的解释(截至 2014 年底),因为这个问题正是我在寻找什么,我将发布一个转录(从 C++ 到 Python)我在this post 中找到的内容。
代码如下,原因如下:
QGrahpicsItem、QPainterPath 和 QPainterPath.Element 是您正在寻找的课程。具体来说,QPainterPath 实现了您在 CorelDraw、Adobe Illustrator 或 Inkscape 等应用程序中所期望的那种矢量功能。QGraphicsEllipseItem(用于渲染节点)和QGraphicsPathItem(用于渲染路径本身),它们继承自QGraphicsItem。Path 构造函数迭代QPainterPath 元素,为每个元素创建Node 项;它们中的每一个依次向父 Path 对象发送更新,该对象相应地更新其 path 属性。#!/usr/bin/env python
# coding: utf-8
from PyQt4.QtGui import *
from PyQt4.QtCore import *
rad = 5
class Node(QGraphicsEllipseItem):
def __init__(self, path, index):
super(Node, self).__init__(-rad, -rad, 2*rad, 2*rad)
self.rad = rad
self.path = path
self.index = index
self.setZValue(1)
self.setFlag(QGraphicsItem.ItemIsMovable)
self.setFlag(QGraphicsItem.ItemSendsGeometryChanges)
self.setBrush(Qt.green)
def itemChange(self, change, value):
if change == QGraphicsItem.ItemPositionChange:
self.path.updateElement(self.index, value.toPointF())
return QGraphicsEllipseItem.itemChange(self, change, value)
class Path(QGraphicsPathItem):
def __init__(self, path, scene):
super(Path, self).__init__(path)
for i in xrange(path.elementCount()):
node = Node(self, i)
node.setPos(QPointF(path.elementAt(i)))
scene.addItem(node)
self.setPen(QPen(Qt.red, 1.75))
def updateElement(self, index, pos):
path.setElementPositionAt(index, pos.x(), pos.y())
self.setPath(path)
if __name__ == "__main__":
app = QApplication([])
path = QPainterPath()
path.moveTo(0,0)
path.cubicTo(-30, 70, 35, 115, 100, 100);
path.lineTo(200, 100);
path.cubicTo(200, 30, 150, -35, 60, -30);
scene = QGraphicsScene()
scene.addItem(Path(path, scene))
view = QGraphicsView(scene)
view.setRenderHint(QPainter.Antialiasing)
view.resize(600, 400)
view.show()
app.exec_()
【讨论】:
QGraphicsItem 中搜索。
hoverEnterEvent和hoverLeaveEvent,找到here。