2016-06-22 5 views
5

Я добавляю поддержку отображения Retina Apple в приложение PyQt5. В то время как я успешно удалось передать иконки высокого разрешения (путем добавления @ 2x суффикс всех моих .png файлов и установка Qt.AA_UseHighDpiPixmaps в моем QApplication), у меня возникают некоторые проблемы в оказании высоких разрешениях QGraphicsItem в QGraphicsScene + QGraphicsView.QGraphicsItem рендеринга на дисплее Retina Apple

В моем приложении, кроме загрузки .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 

которые генерируют один из символов в моей палитре (алмазный).

Eddy Palette

Однако при добавлении элементов к моему 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) 

Eddy Diagram

Текст в форме оказывается правильно, и я не рисую его сам, так как это QGraphicsTextItem с моим QGraphicsItem в качестве родителя.

Проблема в том, что в то время как для QPixmap я могу установить коэффициент пикселя устройства, для QGraphicsItem я не могу. Я что-то упускаю?

Я использую PyQt 5.5.1, построенную против Qt 5.5.1 и SIP 4.18 (не использую 5.6, так как я испытываю несколько сбоев при запуске приложения, о котором я уже сообщал разработчикам PyQt).

ответ

0

Возможно, это не то, что вы хотели услышать, но Qt added retina support in 5.6.

+0

Я предполагаю, что пропустил сообщение в блоге, хотя я искал новости о поддержке высокого DPI в Qt 5.5/5.6. Думаю, мне просто нужно ждать исправления в PyQt 5.6. –

+0

Несмотря на то, что ваш ответ не решает мою проблему (так как это, по-видимому, не разрешимо без обновления до самой новой версии Qt), я дам вам щедрость за усилия. –

-1

Я также борюсь с аналогичной проблемой в PyQt 5.7.

Если вы пишете свой вспомогательный класс QGraphicsItem, попытаться установить визуализации намек на Антиалайзинговые в методе краска():

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) 

Заметим, что это не может быть лучшим или правильный ответ.

Смежные вопросы