2016-06-22 76 views
5

Aggiungo il supporto per il display Retina Apple alla mia applicazione PyQt5. Mentre sono riuscito con successo a rendere le icone ad alta risoluzione (con l'aggiunta del suffisso @ 2x a tutti i miei file .png e l'impostazione del Qt.AA_UseHighDpiPixmaps nel mio QApplication), sto avendo alcuni problemi di rendering in alte risoluzioni QGraphicsItem in un QGraphicsScene + QGraphicsView.QGraphicsItem rendering su Apple Retina Display

Nella mia applicazione, altro che caricare .png file, ho anche generare diversi QPixmap la mia auto (incorporandoli in una Icon), per costruire la tavolozza dei simboli l'utente può utilizzare per aggiungere nuove forme per lo schema reso nel QGraphicsView , ovvero:

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 

Che generano uno dei simboli nella mia tavolozza (quella a rombo).

Eddy Palette

Tuttavia quando ho aggiungere elementi al mio QGraphicsScene, visualizzati in un QGraphicsView essi siano resi in bassa risoluzione:

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

Il testo all'interno della forma è resa in modo corretto, e non lo sto dipingendo da solo perché è un QGraphicsTextItem con il mio QGraphicsItem come genitore.

Il problema è che mentre per QPixmap posso impostare il rapporto pixel del dispositivo, per QGraphicsItem non posso. Mi sto perdendo qualcosa?

Sto usando PyQt 5.5.1 costruito contro Qt 5.5.1 e SIP 4.18 (non usando 5.6 poiché sto riscontrando diversi arresti anomali all'avvio dell'applicazione che ho già segnalato agli sviluppatori PyQt).

risposta

0

Probabilmente non quello che volevi sentire, ma Qt added retina support in 5.6.

+0

Credo di aver perso il post del blog, anche se ho cercato notizie relative al supporto DPI alto in Qt 5.5/5.6. Immagino di dover aspettare una correzione in PyQt 5.6. –

+0

Anche se la tua risposta non risolve il mio problema (dal momento che non è apparentemente risolvibile senza l'aggiornamento alla versione più recente di Qt) ti darò la taglia per lo sforzo. –

-1

Sono anche alle prese con il problema simile in PyQt 5.7.

Se si sta scrivendo la vostra classe sub di QGraphicsItem, cercare di impostare il rendering suggerimento per antialias nel metodo paint():

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) 

Nota, questo non può essere la risposta migliore o corretta.