QGraphicsGridLayout работи в PySide, но не и в PyQt4

От часове се опитвам да накарам QGraphicsGridLayout да работи с PyQt4. Имам инсталиран PySide, така че превключих импортиранията към него за бърза проверка и работи според очакванията! За кода по-долу, когато се използва PySide, методът paint на RectangleWidget се извиква според очакванията, но когато използвате PyQt4, методът paint никога не се извиква.

Знам, че RectangleWidget трябва да замени някои повече виртуални методи за правилно внедряване, но изтривах нещата, за да опитам да получа минималното количество код, за да стесня проблема.

from PySide import QtGui, QtCore
# from PyQt4 import QtGui, QtCore


class RectangleWidget(QtGui.QGraphicsWidget):
    def __init__(self, rect, parent=None):
        super(RectangleWidget, self).__init__(parent)
        self.rect = rect

    def paint(self, painter, *args, **kwargs):
        print('Paint Called')
        painter.drawRect(self.rect)


class MainWindow(QtGui.QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.central_widget = QtGui.QWidget(self)
        central_layout = QtGui.QHBoxLayout()
        self.central_widget.setLayout(central_layout)
        self.setCentralWidget(self.central_widget)
        self.resize(500, 500)

        self.view = QtGui.QGraphicsView()
        self.scene = QtGui.QGraphicsScene()
        self.view.setScene(self.scene)

        panel = QtGui.QGraphicsWidget()
        self.scene.addItem(panel)

        layout = QtGui.QGraphicsGridLayout()
        panel.setLayout(layout)

        for i in range(4):
            for j in range(4):
                rectangle = RectangleWidget(QtCore.QRectF(0, 0, 50, 50))
                layout.addItem(rectangle, i, j)

        central_layout.addWidget(self.view)

if __name__ == '__main__':
    import sys

    app = QtGui.QApplication(sys.argv)
    widget = MainWindow()
    widget.show()
    app.exec_()

Всяка помощ се оценява! Бих искал да поддържам съвместимост както с PyQt4, така и с PySide, така че продължаването на използването само на PySide всъщност не е идеалното решение. Благодаря


person D2B    schedule 15.02.2014    source източник


Отговори (1)


QGraphicsGridLayout поема собственост върху елементите, добавени към него (вижте документи за повече подробности).

Във вашия пример изглежда, че всички RectangleWidget елементи са застрашени от събиране на боклук, след като излязат извън обхвата. Така че, ако им дадете родител:

    rectangle = RectangleWidget(QtCore.QRectF(0, 0, 50, 50), panel)

всичко трябва да е наред.

person ekhumoro    schedule 15.02.2014
comment
Има ли някаква конкретна причина, поради която това се случи само с GridLayout в PyQt4? LinearLayout работи добре както в PyQt4, така и в PySide. Като цяло засега пренебрегвам аспекта на собствеността, но предполагам, че е време да спра да го пренебрегвам. Благодаря. - person D2B; 16.02.2014
comment
@D2B. Трудно е да се каже: събирането на боклука може да бъде непредвидимо. Ето защо пренебрегването на собствеността може да бъде рисковано. - person ekhumoro; 16.02.2014