首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QGraphicsRectItem在PyQt中的子类

QGraphicsRectItem在PyQt中的子类
EN

Stack Overflow用户
提问于 2017-11-06 20:23:04
回答 1查看 1.5K关注 0票数 1

我正在编写一个应用程序,在这个应用程序中,我希望能够通过单击和拖动矩形来移动它们。到目前为止,下面的代码是正确的。

代码语言:javascript
复制
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并添加新特性到它。但是当我实现它时,如下所示

代码语言:javascript
复制
class RectItem(QGraphicsRectItem):

    def __init__(self, rect):
        QGraphicsRectItem.__init__(self)
        self.rectangle = rect

    def boundingRect(self):
        super(RectItem, self).boundingRect()
        return self.rectangle

并将rectangle变量定义为

代码语言:javascript
复制
        rectangle = RectItem(rect)

项目不再是可移动的,即QGraphicsItem.ItemIsMovable标志没有任何影响。

是否有一种简单的方法对QGraphicsRectItem进行子类化,并使所有像setFlag(QGraphicsItem.ItemIsMovable, True)这样的方便函数都能工作呢?

编辑:

正如eyllanesc所指出的,没有必要覆盖boundingRect方法。但是,当我尝试将QGraphicsRectItem子类划分为

代码语言:javascript
复制
class RectItem(QGraphicsRectItem):

    def __init__(self, rect):
        QGraphicsRectItem.__init__(self)

并将rectangle定义为

代码语言:javascript
复制
        rectangle = RectItem(rect)

我的行为和

代码语言:javascript
复制
        rectangle = QGraphicsRectItem(rect)

原因是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-07 14:50:32

当从类继承时,必须调用父类的构造函数并传递一些参数,在这种情况下,您可以使用以下方法:

代码语言:javascript
复制
QGraphicsRectItem.__init__(self)

回顾文档

代码语言:javascript
复制
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(),这个方法用于其他方法,如移动,调整大小等。

出于这个原因,我不建议以这种方式覆盖父类,除了无意中的情况外,当我覆盖一个类时,我总是添加信息(即新参数或将默认值设置为现有参数),继承的一般方法如下:

代码语言:javascript
复制
class RectItem(QGraphicsRectItem):
    def __init__(self, *args, **kwargs):
        QGraphicsRectItem.__init__(self, *args, **kwargs)

如果要添加参数,可以使用以下模板:

代码语言:javascript
复制
class RectItem(QGraphicsRectItem):
    def __init__(self, new_param, *args, **kwargs):
        QGraphicsRectItem.__init__(self, *args, **kwargs)
        self.new_param = new_param

或放置默认值:

代码语言:javascript
复制
class RectItem(QGraphicsRectItem):
    def __init__(self, parent):
        QGraphicsRectItem.__init__(self, rect=QRect(0, 0, 100,100), parent=parent)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47145117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档