Dodaję obsługę monitora Apple Retina Display do mojej aplikacji PyQt5. A ja z powodzeniem udało się uczynić wysokiej rozdzielczości ikon (dodając @ 2x przyrostek do wszystkich moich .png
plików oraz ustawianie Qt.AA_UseHighDpiPixmaps
w moim QApplication
), mam pewne problemy w świadczeniu wysokiej rozdzielczości QGraphicsItem
w QGraphicsScene
+ QGraphicsView
.Wyświetlanie QGraphicsItem na ekranie Apple Retina
W mojej aplikacji, innych niż ładowanie .png
plików, ja też generować kilka QPixmap
mój własny (osadzając je w Icon
), aby zbudować paletę symboli użytkownik może używać do dodawania nowych kształtów na diagramie renderowane w QGraphicsView
, czyli:
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
Które generują jeden z symboli w mojej palecie (diamentowy).
Jednakże kiedy dodać elementy do mojego QGraphicsScene
wyświetlane w QGraphicsView
są renderowane w niskiej rozdzielczości:
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)
tekst w kształcie staje się poprawnie, i nie maluję tego samemu, ponieważ jest to QGraphicsTextItem
, ponieważ mój rodzic jest rodzicem QGraphicsItem
.
Problem polega na tym, że podczas gdy dla QPixmap
mogę ustawić stosunek pikseli urządzenia, dla QGraphicsItem
nie mogę. Czy czegoś brakuje?
Używam PyQt 5.5.1 zbudowanego na Qt 5.5.1 i SIP 4.18 (nie używając 5.6 ponieważ mam kilka awarii przy uruchomieniu aplikacji, które już zgłosiłem do deweloperów PyQt).
Chyba brakowało mi wpisu na blogu, mimo że szukałem wiadomości dotyczących obsługi wysokiej rozdzielczości w Qt 5.5/5.6. Chyba po prostu muszę poczekać na poprawkę w PyQt 5.6. –
Mimo że twoja odpowiedź nie rozwiązuje mojego problemu (ponieważ nie da się go rozwiązać bez uaktualnienia do najnowszej wersji Qt) dam ci nagrodę za wysiłek. –