我希望使用PyQt4实现一个类似于虚幻游戏引擎蓝图编辑器的GUI程序。以下是蓝图编辑器的示例:
问题是我想要在组件下面显示两条线,但组件是先创建的。是否有一种方法可以重新排列
QPainterPath
小部件绘制连接组件的线条。由于用户可以通过拖放将组件放置在任何位置,因此我选择在容器小部件中使用绝对定位。以下是示例代码:class Component(QtGui.QWidget):
"""A simple rectangle."""
def __init__(self, type_, parent=None):
super(Component, self).__init__(parent)
...
class BezierPath(QtGui.QWidget):
def __init__(self, start, end, parent=None):
super(BezierPath, self).__init__(parent)
self.setMinimumSize(300, 500)
self._start = start
self._end = end
self._path = self._generate_path(self._start, self._end)
self.setMinimumSize(
abs(start.x()-end.x()), abs(start.y()-end.y()))
def _generate_path(self, start, end):
path = QtGui.QPainterPath()
path.moveTo(start)
central_x = (start.x()+end.x())*0.5
path.cubicTo(
QtCore.QPointF(central_x, start.y()),
QtCore.QPointF(central_x, end.y()),
end)
return path
def paintEvent(self, event):
painter = QtGui.QPainter()
painter.begin(self)
pen = QtGui.QPen()
pen.setWidth(3)
painter.setPen(pen)
painter.setRenderHint(QtGui.QPainter.Antialiasing, True)
painter.drawPath(self._path)
painter.end()
class Container(QtGui.QWidget):
def add_component(self, component_type, position):
component = Component(component_type, self)
component.move(position)
def add_connection(self, component_a, component_b):
bezier_path = BezierPath(component_a.pos(), component_b.pose(), self)
问题是我想要在组件下面显示两条线,但组件是先创建的。是否有一种方法可以重新排列
Container
的子部件,或者我应该使用更好的方法来组织组件?
Container
中添加一个小部件,确保它在底部,然后将所有的BezierPath
添加到该小部件中。 - kkpattern