我将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
在我的调色板中生成一个符号(钻石一个)。
但是当我向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)
形状中的文字是正确呈现的,我不会自己绘画,因为它是QGraphicsTextItem
我的QGraphicsItem
为父母。
问题是,对于QPixmap
,我可以设置设备像素比率,而QGraphicsItem
我不能。我错过了什么吗?
我使用针对Qt 5.5.1和SIP 4.18构建的PyQt 5.5.1(不使用5.6,因为我已经在应用程序启动时遇到了几次崩溃,我已经向PyQt开发人员报告过了。)
答案 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)
请注意,这可能不是最佳或正确答案。