2016-06-22 16 views
5

私は、Apple Retina DisplayのPyQt5アプリケーションへのサポートを追加しています。私は成功した(すべての私の.pngファイルに 2倍@サフィックスを追加すると、私のQApplicationQt.AA_UseHighDpiPixmapsを設定することにより)、高解像度のアイコンをレンダリングするために管理している間、私はQGraphicsScene + QGraphicsViewに高解像度QGraphicsItemをレンダリングする際に、いくつかのトラブルを抱えています。私のアプリケーションでApple Retina DisplayのQGraphicsItemレンダリング

、他の.pngファイルをロードするよりも、私はまた、いくつかのQPixmap私の自己ユーザーがQGraphicsViewにレンダリング図に新しい図形を追加するために使用できるシンボルのパレットを構築するために、(Iconにそれらを埋め込む)を生成しますすなわち、:

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 

私のパレット(ダイヤモンドワン)のシンボルの1つを生成します。

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

を形状内のテキストが正しくレンダリングされ、私はQGraphicsItemを親として持つQGraphicsTextItemですから、私はそれを自分で描いていません。

問題は、QPixmapのデバイスのピクセル比率を設定できますが、QGraphicsItemではできません。何か不足していますか?

私は既にQt 5.5.1とSIP 4.18(PyQt開発者に報告したアプリケーションの起動時にいくつかのクラッシュが発生しているので5.6を使用していない)に対してビルドされたPyQt 5.5.1を使用しています。

答えて

0

おそらくあなたが聞きたいものではありませんが、Qt added retina support in 5.6です。

+0

Qt 5.5/5.6でハイDPIサポートに関するニュースを探していましたが、私はブログ記事を見逃してしまったと思います。私はPyQt 5.6での修正を待たなければならないと思う。 –

+0

あなたの答えが私の問題を解決しないにもかかわらず(Qtの最新バージョンにアップグレードせずに解決できないと思われるので)、私はあなたに努力の恩恵を与えます。 –

-1

私はPyQt 5.7でも同様の問題を抱えています。

あなたがQGraphicsItemのあなたのサブクラスを作成している場合は、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) 

注、これは最高や正解ではないかもしれません。

関連する問題