2016-06-22 16 views
5

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).

Eddy Palette

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) 

Eddy Diagram

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).

Odpowiedz

0

Prawdopodobnie nie to, co chciałeś usłyszeć, ale Qt added retina support in 5.6.

+0

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. –

+0

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. –

-1

Mam również problem z podobnym problemem w PyQt 5.7.

Jeśli piszesz swoją klasę Sub QGraphicsItem, spróbuj ustawić czyni aluzję do Wygładzanie w metodzie 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) 

Uwaga, to może nie być najlepszym lub prawidłowa odpowiedź.

Powiązane problemy