PyQt4:如何重新排序子窗口小部件?

时间:2015-06-26 03:42:19

标签: python qt pyqt4

我想用PyQt4实现像虚幻游戏引擎中的蓝图编辑器这样的GUI程序。以下是蓝图编辑器的示例:

enter image description here

首先,我创建一个简单的容器小部件来放置所有组件(矩形)。然后我使用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的子窗口小部件?我应该使用更好的方法来组织组件吗?

1 个答案:

答案 0 :(得分:1)

我找到了一个自行重新排序子窗口小部件的解决方案。我将这个答案标记为现在已被接受。这不是一个完美的解决方案,所以如果有更好的答案我会接受它。无论如何这里是解决方案:

在qt4中,小部件有一个方法raise_(),在这里我引用:

  

将此窗口小部件提升到父窗口小部件堆栈的顶部。后   这个调用小部件将在视觉上在任何重叠之前   兄弟小部件。

因此,如果要重新排序所有窗口小部件,首先要将所有子窗口小部件的引用保留在您自己的列表中或您选择的容器中。重新排序您自己的容器中的所有小部件,然后以相反的顺序为每个小部件调用raise_()