PyQt 5.7中GraphicsView中的奇怪绘画错误

时间:2016-09-07 17:31:21

标签: qt pyqt5

[用更小的例子更新]

我们刚刚升级到PyQt 5.7,我们还有一个问题需要解决。这是我从应用程序代码创建的独立示例。运行它,看看如何绘制椭圆超出视图边界。这在5.5.1中没有发生。平台是Windows 7 64位(在VM中运行)。它看起来像这样:

enter image description here

from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QGraphicsView, QGraphicsScene, QHBoxLayout, QWidget, QLabel
from PyQt5.QtWidgets import QGraphicsProxyWidget, QGraphicsObject, QGraphicsEllipseItem
from PyQt5.QtGui import QBrush


class MyGraphicsItem(QGraphicsObject):

    def __init__(self):
        QGraphicsObject.__init__(self)

        # next line could be any type of graphics item:
        rect_item = QGraphicsEllipseItem(0, 0, 100, 100, self)
        # effect easier to see if paint black:
        rect_item.setBrush(QBrush(Qt.SolidPattern))

        label_item = QGraphicsProxyWidget(self)
        # *** Next line must be there for effect to be visible, but could be any other type of widget
        label_item.setWidget(QLabel('a'*30))

    def paint(self, painter, option, widget=None):
        return

    def boundingRect(self):
        return self.childrenBoundingRect()


def show_problem():
    app = QApplication([])

    widget = QWidget()
    layout = QHBoxLayout()
    widget.setLayout(layout)

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

    scene.addItem(MyGraphicsItem())  # *** effect only there if more than 1 item
    scene.addItem(MyGraphicsItem())

    layout.addWidget(view)

    widget.setGeometry(100, 100, 50, 50)
    widget.show()
    app.exec()


show_problem()

1 个答案:

答案 0 :(得分:2)

所以Russell确认this is a regression in 5.7(即PyQt 5.6中没有问题)。

我向Qt论坛发布了我的Python示例的C ++版本。有一个人足以修复编译错误并运行它,并看到了错误:所以这确实是一个Qt错误。

bug report at bugreports.qt.io几乎肯定是同一个问题。它没有得到解决,但通过令人难以置信的运气,它链接到帖子where there is a workaround:将代理小部件项目的不透明度设置为低于1.在我的帖子的示例应用程序中,我添加了

label_item.setOpacity(0.999999)

设置label_item的小部件后。我的真实应用程序(110k PyQt代码)我设置了所有QGraphicsProxyWidget实例的不透明度,它似乎工作。

这种解决方法似乎没有任何其他副作用,时间会判断是否存在更深层次的问题。但它似乎至少是一个临时解决方案,直到在Qt中修复bug。我已提交了bug report