Apple Retina Display上的QGraphicsItem渲染

时间:2016-06-22 08:01:17

标签: qt pyqt retina-display qgraphicsview qgraphicsitem

我将Apple Retina Display的支持添加到我的PyQt5应用程序中。虽然我成功设法渲染了高分辨率图标(通过在我的.png文件中添加 @ 2x 后缀并在Qt.AA_UseHighDpiPixmaps中设置QApplication),我和#39;在QGraphicsItem + QGraphicsScene中呈现高分辨率QGraphicsView时遇到一些麻烦。

在我的应用程序中,除了加载.png文件之外,我还生成了几个QPixmap我自己(将它们嵌入Icon),以构建用户可以使用的符号调色板将新形状添加到QGraphicsView中呈现的图表中,即:

def icon(cls, width, height, **kwargs):
    """
    Returns an icon of this item suitable for the palette.
    :type width: int
    :type height: int
    :rtype: QIcon
    """
    icon = QIcon()
    for i in (1.0, 2.0):
        # CREATE THE PIXMAP
        pixmap = QPixmap(width * i, height * i)
        pixmap.setDevicePixelRatio(i)
        pixmap.fill(Qt.transparent)
        # PAINT THE SHAPE
        polygon = cls.createPolygon(46, 34)
        painter = QPainter(pixmap)
        painter.setRenderHint(QPainter.Antialiasing)
        painter.setPen(QPen(QColor(0, 0, 0), 1.1, Qt.SolidLine))
        painter.setBrush(QColor(252, 252, 252))
        painter.translate(width / 2, height / 2)
        painter.drawPolygon(polygon)
        # PAINT THE TEXT INSIDE THE SHAPE
        painter.setFont(Font('Arial', 11, Font.Light))
        painter.drawText(polygon.boundingRect(), Qt.AlignCenter, 'role')
        painter.end()
        # ADD THE PIXMAP TO THE ICON
        icon.addPixmap(pixmap)
    return icon

在我的调色板中生成一个符号(钻石一个)。

Eddy Palette

但是当我向QGraphicsScene添加元素时,显示在QGraphicsView中,它们会以低分辨率呈现:

def paint(self, painter, option, widget=None):
    """
    Paint the node in the diagram.
    :type painter: QPainter
    :type option: QStyleOptionGraphicsItem
    :type widget: QWidget
    """
    painter.setPen(self.pen)
    painter.setBrush(self.brush)
    painter.drawPolygon(self.polygon)

Eddy Diagram

形状中的文字是正确呈现的,我不会自己绘画,因为它是QGraphicsTextItem我的QGraphicsItem为父母。

问题是,对于QPixmap,我可以设置设备像素比率,而QGraphicsItem我不能。我错过了什么吗?

我使用针对Qt 5.5.1和SIP 4.18构建的PyQt 5.5.1(不使用5.6,因为我已经在应用程序启动时遇到了几次崩溃,我已经向PyQt开发人员报告过了。)

2 个答案:

答案 0 :(得分:0)

可能不是你想听到的,但是Qt added retina support in 5.6

答案 1 :(得分:-1)

我也在为PyQt 5.7中的类似问题苦苦挣扎。

如果您正在编写QGraphicsItem的子类,请尝试在paint()方法中将渲染提示设置为antialias:

def paint(self, painter, option, widget=None):
    """
    Paint the node in the diagram.
    :type painter: QPainter
    :type option: QStyleOptionGraphicsItem
    :type widget: QWidget
    """
    painter.setPen(self.pen)
    painter.setBrush(self.brush)
    painter.setRenderHint(QPainter.Antialiasing) # <-- add this line
    painter.drawPolygon(self.polygon)

请注意,这可能不是最佳或正确答案。