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

Posted

技术标签:

【中文标题】PyQt 5.7 中 GraphicsView 中的奇怪绘画错误【英文标题】:Strange painting bug in GraphicsView in PyQt 5.7 【发布时间】:2016-09-07 17:31:21 【问题描述】:

[用更小的例子更新]

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

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】:

因此,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 report。

【讨论】:

Schollii,感谢您的解决方法。拜托,您能否跟进错误报告,因为他们要求的是最低限度的工作示例?在您回复之前,他们已关闭问题。 @lopital 我很乐意,但在过去,我还没有在 Windows 和空闲时间访问 c++ 开发环境,只是其中一个。 :(。

以上是关于PyQt 5.7 中 GraphicsView 中的奇怪绘画错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 pyQtGraph 在 pyqt graphicsView 中绘制图像

pyqt5 graphics view简单使用

QGraphicsview 中的 PyQt pyqtgraph

PyQt5-使用scrollArea实现图片查看器功能

PyQt 将 graphicsScene 对象分组为一个对象

PyQt 设计师提升小部件 - 引用***对象?