Python 如何在PyQT中绘制节点和边?
在PyQT中,如何在给定点绘制小“节点”并将它们与边连接?我找到的所有PyQT教程都是“打印按钮!打印复选框!”Python 如何在PyQT中绘制节点和边?,python,user-interface,graph,pyqt,Python,User Interface,Graph,Pyqt,在PyQT中,如何在给定点绘制小“节点”并将它们与边连接?我找到的所有PyQT教程都是“打印按钮!打印复选框!” 提前非常感谢如果您希望能够与绘图中显示的对象进行交互,最好使用。它处理缩放和平移,还可以包含其他可以处理自身交互的对象 它很容易使用,但是会有一点开销,特别是如果您计划制作数千个对象 您可以找到PyQt教程。这和API文档应该让您开始学习 > P> >对这个问题(如2014年底之前)已经找到了一个很好的解释,这是一个痛苦的问题,因为这个问题明确地问了我要寻找什么,我会把一个转录(从C
提前非常感谢如果您希望能够与绘图中显示的对象进行交互,最好使用。它处理缩放和平移,还可以包含其他可以处理自身交互的对象 它很容易使用,但是会有一点开销,特别是如果您计划制作数千个对象
您可以找到PyQt教程。这和API文档应该让您开始学习 > P> >对这个问题(如2014年底之前)已经找到了一个很好的解释,这是一个痛苦的问题,因为这个问题明确地问了我要寻找什么,我会把一个转录(从C++到Python)发布到我所发现的。 代码如下,基本原理如下:
QGrahpicsItem
、QPainterPath
和QPainterPath.Element
是您要查找的类。具体来说,实现了您在CorelDraw、Adobe Illustrator或Inkscape等应用程序中所期望的向量功能QGraphicsEllipseItem
(用于渲染节点)和QGraphicsPathItem
(用于渲染路径本身),它们继承自QGraphicsItem
Path
构造函数迭代QPainterPath
元素,为每个元素创建节点
项;它们中的每一个依次向父路径对象发送更新,父路径对象相应地更新其Path
属性不知道您链接到的教程。每当我关闭PyQt应用程序时,我都会遇到分段错误。教程是从2008年开始的,所以在此期间有些事情可能已经改变了。关闭时的Segfault通常表示基本QT类(QApplication、QMainWindow等)的生存期/配置有问题。如果你可以为你的PyQt版本运行教程,你应该能够合并必要的项目来让QGraphicscene工作。我已经解决了我的问题。但是,是的,这个版本很旧。这个代码最近帮了我很多忙!谢谢同样,我试图在类节点——MouthPrimeSevs/MeLeCK中绘制一个函数来向路径Rito to添加一个控制点。()因此,从点A> B我可以在中间添加点C。所以我可以做一个“L”形。。。意思>A/B左上/右下,C为角。。。但我不确定这是不是正确的方法,因为当我按下时,我没有检测到红色的画线,只有圆圈。。。有什么提示吗?谢谢@Dariusz我肯定Qt中有某种内置的“mouseover”事件或标志,但我不记得它的名称,也不记得它是哪个类的。我会在
QGraphicsItem
@Dariusz中开始搜索,实际上我找到了它们,它们是hoverEnterEvent
和hoverLeaveEvent
,找到了。
#!/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_()