我正在编写一个应用程序,在这个应用程序中,我希望能够通过单击和拖动矩形来移动它们。到目前为止,下面的代码是正确的。
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import sys
class Memory(QWidget):
grid = None
scene = None
def __init__(self, geometry, parent=None):
super(Memory, self).__init__(parent=parent)
self.layout = QGridLayout(self)
self.scene = QGraphicsScene(self)
self.scene.setSceneRect(geometry.x(), geometry.y(), geometry.width(), geometry.height())
self.scene.setBackgroundBrush(Qt.white)
self.view = QGraphicsView()
self.view.setScene(self.scene)
self.layout.addWidget(self.view)
rect = QRectF(40, 40, 220, 110)
self.make_proxy(rect)
rect2 = QRectF(300, 40, 220, 110)
self.make_proxy(rect2)
def make_proxy(self, rect):
label = QLabel('World')
label.setAlignment(Qt.AlignCenter | Qt.AlignCenter)
# create proxy
proxy = QGraphicsProxyWidget()
proxy.setWidget(label)
proxy.setGeometry(rect)
self.scene.addItem(proxy)
# create parent item
rectangle = QGraphicsRectItem(rect)
rectangle.setFlag(QGraphicsItem.ItemIsMovable, True)
self.scene.addItem(rectangle)
# set parent
proxy.setParentItem(rectangle)
def main():
app = QApplication(sys.argv)
form = Memory(QRect(10, 10, 550, 180))
form.show()
app.exec_()
if __name__ == '__main__':
main()然而,第一个矩形总是在底部的场景,因为它是在第一次添加到它。但是当我点击它的时候,它应该会转到场景的顶部,这样它就会出现在第二个矩形上面。这就是为什么我想要子类QGraphicsRectItem并添加新特性到它。但是当我实现它时,如下所示
class RectItem(QGraphicsRectItem):
def __init__(self, rect):
QGraphicsRectItem.__init__(self)
self.rectangle = rect
def boundingRect(self):
super(RectItem, self).boundingRect()
return self.rectangle并将rectangle变量定义为
rectangle = RectItem(rect)项目不再是可移动的,即QGraphicsItem.ItemIsMovable标志没有任何影响。
是否有一种简单的方法对QGraphicsRectItem进行子类化,并使所有像setFlag(QGraphicsItem.ItemIsMovable, True)这样的方便函数都能工作呢?
编辑:
正如eyllanesc所指出的,没有必要覆盖boundingRect方法。但是,当我尝试将QGraphicsRectItem子类划分为
class RectItem(QGraphicsRectItem):
def __init__(self, rect):
QGraphicsRectItem.__init__(self)并将rectangle定义为
rectangle = RectItem(rect)我的行为和
rectangle = QGraphicsRectItem(rect)原因是什么?
发布于 2017-11-07 14:50:32
当从类继承时,必须调用父类的构造函数并传递一些参数,在这种情况下,您可以使用以下方法:
QGraphicsRectItem.__init__(self)回顾文档
QGraphicsRectItem(QGraphicsItem *parent = Q_NULLPTR)
QGraphicsRectItem(const QRectF &rect, QGraphicsItem *parent = Q_NULLPTR)
QGraphicsRectItem(qreal x, qreal y, qreal width, qreal height, QGraphicsItem *parent = Q_NULLPTR)在没有父函数和QRect的情况下,您使用的是第一个构造函数。
检查文档
.
QGraphicsRectItem使用矩形和笔宽来提供boundingRect()、shape()和contains()的合理实现。..。
从这里我们可以看到,他使用QRect作为boundingRect(),这个方法用于其他方法,如移动,调整大小等。
出于这个原因,我不建议以这种方式覆盖父类,除了无意中的情况外,当我覆盖一个类时,我总是添加信息(即新参数或将默认值设置为现有参数),继承的一般方法如下:
class RectItem(QGraphicsRectItem):
def __init__(self, *args, **kwargs):
QGraphicsRectItem.__init__(self, *args, **kwargs)如果要添加参数,可以使用以下模板:
class RectItem(QGraphicsRectItem):
def __init__(self, new_param, *args, **kwargs):
QGraphicsRectItem.__init__(self, *args, **kwargs)
self.new_param = new_param或放置默认值:
class RectItem(QGraphicsRectItem):
def __init__(self, parent):
QGraphicsRectItem.__init__(self, rect=QRect(0, 0, 100,100), parent=parent)https://stackoverflow.com/questions/47145117
复制相似问题