В PyQT, как я могу нарисовать небольшие "узлы" в заданных точках и соединить их с ребрами? Все обучающие программы PyQT, которые я нахожу, это "заговор на кнопку!". Установите флажок! "
Огромное спасибо заранее
В PyQT, как я могу нарисовать небольшие "узлы" в заданных точках и соединить их с ребрами? Все обучающие программы PyQT, которые я нахожу, это "заговор на кнопку!". Установите флажок! "
Огромное спасибо заранее
Если вы хотите иметь возможность взаимодействовать с объектами, отображаемыми на графике, вам будет лучше использовать QGraphicsScene. Он обрабатывает масштабирование и панорамирование и может содержать другие объекты QGraphicsItem, которые могут обрабатывать их собственные взаимодействия.
Он очень прост в использовании, но есть немного накладных расходов, особенно если вы планируете создавать тысячи объектов.
Здесь вы можете найти учебник PyQt здесь. Это и документы API должны начать работу.
Было больно найти хорошее объяснение этому (по состоянию на конец 2014 года), и так как этот вопрос спрашивает, что я искал, я опубликую транскрипцию (от С++ до Python) о том, что я нашел в этот пост.
Код ниже, и вот логическое обоснование:
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_()