2016-06-22 19 views
5

Ich füge Unterstützung für die Apple Retina Display zu meiner PyQt5-Anwendung. Während ich erfolgreich hochauflösende Icons machen verwaltet (durch die @ 2x Suffix an alle meine .png Dateien hinzufügen und die Qt.AA_UseHighDpiPixmaps in meinem QApplication Einstellung), habe ich einige Probleme beim Rendern hohen Auflösungen QGraphicsItem in einem QGraphicsScene + QGraphicsView.QGraphicsItem Rendering auf Apple Retina Display

In meiner Anwendung, die nicht geladen .png Dateien, ich erzeuge auch mehrere QPixmap mich selbst (sie in ein Icon Einbettung), die Palette von Symbolen bauen der Benutzer neue Formen verwenden kann, um das Diagramm in den QGraphicsView gemacht hinzufügen , das heißt:

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 

Welche eines der Symbole in meiner Palette (der Diamant eins) zu erzeugen. Jedoch

Eddy Palette

wenn ich hinzufügen, Elemente meiner QGraphicsScene, angezeigt in einem QGraphicsView sie in niedriger Auflösung wiedergegeben werden:

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

Der Text in der Form ist korrekt wiedergegeben, und ich male es nicht selbst, da es eine QGraphicsTextItem hat, die meine QGraphicsItem als Elternteil hat.

Das Problem ist, dass während ich für QPixmap das Gerät Pixel-Verhältnis kann, für QGraphicsItem kann ich nicht. Fehle ich etwas?

Ich benutze PyQt 5.5.1 gebaut gegen Qt 5.5.1 und SIP 4.18 (nicht mit 5.6, da ich mehrere Abstürze beim Start der Anwendung, die ich bereits an PyQt Devs berichtet).

Antwort

0

Wahrscheinlich nicht das, was Sie hören wollten, aber Qt added retina support in 5.6.

+0

Ich denke, ich habe den Blogpost verpasst, obwohl ich nach Neuigkeiten bezüglich der Unterstützung für hohe DPI in Qt 5.5/5.6 gesucht habe. Ich denke, ich muss nur auf eine Korrektur in PyQt 5.6 warten. –

+0

Obwohl deine Antwort mein Problem nicht löst (da es anscheinend nicht lösbar ist, ohne auf die neueste Version von Qt zu aktualisieren), gebe ich dir das Kopfgeld für die Mühe. –

-1

Ich kämpfe auch mit dem ähnlichen Problem in PyQt 5.7.

Wenn Sie Ihre Unterklasse von QGraphicsItem schreiben, versucht Hinweis auf Anti-Aliasing in der Farbe() -Methode zu setzen Render:

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) 

Hinweis, dies nicht die beste oder Antwort richtig sein kann.