Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在PyQT中绘制节点和边?_Python_User Interface_Graph_Pyqt - Fatal编程技术网

Python 如何在PyQT中绘制节点和边?

Python 如何在PyQT中绘制节点和边?,python,user-interface,graph,pyqt,Python,User Interface,Graph,Pyqt,在PyQT中,如何在给定点绘制小“节点”并将它们与边连接?我找到的所有PyQT教程都是“打印按钮!打印复选框!” 提前非常感谢如果您希望能够与绘图中显示的对象进行交互,最好使用。它处理缩放和平移,还可以包含其他可以处理自身交互的对象 它很容易使用,但是会有一点开销,特别是如果您计划制作数千个对象 您可以找到PyQt教程。这和API文档应该让您开始学习 > P> >对这个问题(如2014年底之前)已经找到了一个很好的解释,这是一个痛苦的问题,因为这个问题明确地问了我要寻找什么,我会把一个转录(从C

在PyQT中,如何在给定点绘制小“节点”并将它们与边连接?我找到的所有PyQT教程都是“打印按钮!打印复选框!”


提前非常感谢

如果您希望能够与绘图中显示的对象进行交互,最好使用。它处理缩放和平移,还可以包含其他可以处理自身交互的对象

它很容易使用,但是会有一点开销,特别是如果您计划制作数千个对象


您可以找到PyQt教程。这和API文档应该让您开始学习

> P> >对这个问题(如2014年底之前)已经找到了一个很好的解释,这是一个痛苦的问题,因为这个问题明确地问了我要寻找什么,我会把一个转录(从C++到Python)发布到我所发现的。

代码如下,基本原理如下:

  • QGrahpicsItem
    QPainterPath
    QPainterPath.Element
    是您要查找的类。具体来说,实现了您在CorelDraw、Adobe Illustrator或Inkscape等应用程序中所期望的向量功能
  • 下面的示例受益于先前存在的
    QGraphicsEllipseItem
    (用于渲染节点)和
    QGraphicsPathItem
    (用于渲染路径本身),它们继承自
    QGraphicsItem
  • Path
    构造函数迭代
    QPainterPath
    元素,为每个元素创建
    节点
    项;它们中的每一个依次向父路径对象发送更新,父路径对象相应地更新其
    Path
    属性
  • 我发现,比其他地方发现的结构比较少的PyQT文档更容易学习C++ QT4文档。一旦你习惯了C++和Python之间的心理转换,文档本身就是一个学习如何使用每个类的强大方法。

    不知道您链接到的教程。每当我关闭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_()