2014-02-15 70 views
2

我一直試圖使用QGraphicsGridLayout來使用PyQt4。我安裝了PySide,因此我將導入切換爲快速檢查,並按預期工作!對於下面的代碼,當使用PySide時,RectangleWidget上的paint方法將按預期方式調用,但在使用PyQt4時,將永遠不會調用paint方法。QGraphicsGridLayout可以在PySide中使用,但不能在PyQt4中使用

我知道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_() 

任何幫助表示讚賞!我想保持與PyQt4PySide的兼容性,所以繼續使用PySide只是不是一個真正的理想解決方案。謝謝

回答

1

QGraphicsGridLayout取得添加到它的項目的所有權(有關更多詳細信息,請參閱docs)。

在你的例子中,似乎所有RectangleWidget物品在超出範圍後都有被垃圾收集的危險。所以如果你給他們一個父母:

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

一切都會好的。

+0

是否有任何特別的原因,爲什麼這隻發生在PyQt4的GridLayout? LinearLayout在PyQt4和PySide中都運行良好。我現在一般都忽略了所有權方面,但我想現在是時候停止忽視了。謝謝。 – D2B

+0

@ D2B。很難說:垃圾收集可能是不可預測的。這就是爲什麼忽視所有權可能有風險的原因。 – ekhumoro

相關問題