Sorting 我可以在PyQt4中的其他小部件上对要绘制的QPaint进行排序吗?

Sorting 我可以在PyQt4中的其他小部件上对要绘制的QPaint进行排序吗?,sorting,qt4,pyqt4,qpainter,Sorting,Qt4,Pyqt4,Qpainter,我正在用PyQt4做一个基本的节点编辑器。然而,我坚持这样做:链接节点的线被画在小部件的后面,而它的顺序应该是相反的。 有没有办法强制这样做,或者我应该从头开始尝试另一种方法 附加的代码应该可以工作,并为您提供2个可以移动的节点。连接它们的线是在事物的后面而不是上面画的 多谢各位 from PyQt4 import QtGui from PyQt4.QtCore import * from PyQt4.QtGui import * from PyQt4.QtCore import Qt impo

我正在用PyQt4做一个基本的节点编辑器。然而,我坚持这样做:链接节点的线被画在小部件的后面,而它的顺序应该是相反的。 有没有办法强制这样做,或者我应该从头开始尝试另一种方法

附加的代码应该可以工作,并为您提供2个可以移动的节点。连接它们的线是在事物的后面而不是上面画的

多谢各位

from PyQt4 import QtGui
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtCore import Qt
import sys


class Connector():
    def __init__(self, name="", id=id, data=None, connected=None, isInput=True, index=-1, parent=None):
        self.id = id
        self.name = name
        self.data = data
        self.parent = parent
        self.isConnected = not connected
        self.connectedTo = connected
        self.isInput = isInput
        self.index = index
        self.width = 16
        self.height = 16
        self.upperMargin = 30

    def getAbsPosition(self):
        return QPoint(self.parent.pos().x()+self.getPosition().x(), self.parent.pos().y() + self.getPosition().y())

    def getPosition(self):
        if self.parent:
            if self.isInput:
                deltaX = 0 + self.width / 2
            else:
                deltaX = self.parent.width() - self.width
            deltaY = self.upperMargin + (self.index * self.height*2)
            pos = QPoint(deltaX, deltaY)
        else:
            pos = QPoint(0, 0)

        return pos

class Node(QLineEdit ):
    def __init__(self,parent=None, name=""):
        QLineEdit.__init__(self,parent)
        self.size = QSize(200, 300)
        self.setText(name)
        self.resize(self.size.width(), self.size.height())
        self.connectors = []
        self.createInputConnector()
        self.createOutputConnector()

    def getConnectors(self):
        return self.connectors

    def getNewConnectorIndex(self):
        indexInputs = 0
        indexOutputs = 0
        for connector in self.connectors:
            if connector.isInput:
                indexInputs += 1
            else:
                indexOutputs += 1
        return indexInputs, indexOutputs

    def createConnector(self, name, isInput, index):
        newConnector = Connector(name=name, isInput=isInput, index=index, parent=self)
        self.connectors.append(newConnector)
        return newConnector

    def createInputConnector(self, name=""):
        index, ignore = self.getNewConnectorIndex()
        newConnector = self.createConnector(name, isInput=True, index=index)
        return newConnector

    def createOutputConnector(self, name=""):
        ignore, index = self.getNewConnectorIndex()
        newConnector = self.createConnector(name, isInput=False, index=index)
        return newConnector

    def paintEvent(self, event):
        painter = QPainter()
        painter.begin(self)
        painter.path = QPainterPath()

        # disabling next line "solves" the problem but not really.
        painter.setBrush(QColor(122, 163, 39))

        painter.path.addRoundRect(2,2, self.size.width()-6,self.size.height()-6,20,15)
        painter.drawPath(painter.path)

        for connector in self.connectors:
            pos = connector.getPosition()
            cx = pos.x()
            cy = pos.y()
            cw = connector.width
            ch = connector.height
            painter.drawEllipse(cx, cy, cw, ch)
        painter.end()


    def mousePressEvent(self, event):
        self.__mousePressPos = None
        self.__mouseMovePos = None
        if event.button() == Qt.LeftButton:
            self.__mousePressPos = event.globalPos()
            self.__mouseMovePos = event.globalPos()
        super(Node, self).mousePressEvent(event)

    def mouseMoveEvent(self, event):
        if event.buttons() == Qt.LeftButton:
            currPos = self.mapToGlobal(self.pos())
            globalPos = event.globalPos()
            diff = globalPos - self.__mouseMovePos
            newPos = self.mapFromGlobal(currPos + diff)
            self.move(newPos)
            self.__mouseMovePos = globalPos
        super(Node, self).mouseMoveEvent(event)

    def mouseReleaseEvent(self, event):
        if self.__mousePressPos is not None:
            moved = event.globalPos() - self.__mousePressPos
            if moved.manhattanLength() > 3:
                event.ignore()
                return
        super(Node, self).mouseReleaseEvent(event)


class Window(QMainWindow):

    def __init__(self):
        QMainWindow.__init__(self)
        self.resize(640,480)
        self.entry1 = Node(self, "NODE1")
        self.entry2 = Node(self, "NODE2")

    def paintEvent(self, e):
        qp = QtGui.QPainter()
        qp.begin(self)
        qp.setClipping(False)
        self.doDrawing(qp)
        qp.end()
        self.update()

    def doDrawing(self, qp):
        p1 = self.entry1.getConnectors()[0].getAbsPosition()
        p2 = self.entry2.getConnectors()[0].getAbsPosition()
        qp.drawLine(p1.x(),p1.y(), p2.x(), p2.y())

if __name__=="__main__":
    app=QApplication(sys.argv)
    win=Window()
    win.show()
    sys.exit(app.exec_())

我认为问题在于主窗口在绘制连接器后会自动重新绘制。如果你能在每次更新后找到一种方法来画线,这会有帮助,尽管我不确定你会如何做到。我认为你可以克服这个问题的一种方法是在
QMainWindow::paintEvent
中一次完成整个绘制,这将解决你的问题。