同心圆示例¶
展示了抗锯齿和浮点精度带来的质量提升。
应用程序的主窗口显示了几个小部件,这些小部件是使用不同的精度和抗锯齿组合绘制的。
# Copyright (C) 2013 Riverbank Computing Limited.
# Copyright (C) 2022 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
from __future__ import annotations
"""PySide6 port of the widgets/painting/concentriccircles example from Qt v5.x, originating
from PyQt"""
from PySide6.QtCore import QRect, QRectF, QSize, Qt, QTimer
from PySide6.QtGui import QColor, QPainter, QPalette, QPen
from PySide6.QtWidgets import (QApplication, QFrame, QGridLayout, QLabel,
QSizePolicy, QWidget)
class CircleWidget(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self._float_based = False
self.antialiased = False
self._frame_no = 0
self.setBackgroundRole(QPalette.Base)
self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
def set_float_based(self, floatBased):
self._float_based = floatBased
self.update()
def set_antialiased(self, antialiased):
self.antialiased = antialiased
self.update()
def minimumSizeHint(self):
return QSize(50, 50)
def sizeHint(self):
return QSize(180, 180)
def next_animation_frame(self):
self._frame_no += 1
self.update()
def paintEvent(self, event):
with QPainter(self) as painter:
painter.setRenderHint(QPainter.RenderHint.Antialiasing, self.antialiased)
painter.translate(self.width() / 2, self.height() / 2)
for diameter in range(0, 256, 9):
delta = abs((self._frame_no % 128) - diameter / 2)
alpha = 255 - (delta * delta) / 4 - diameter
if alpha > 0:
painter.setPen(QPen(QColor(0, diameter / 2, 127, alpha), 3))
if self._float_based:
painter.drawEllipse(QRectF(-diameter / 2.0,
-diameter / 2.0, diameter, diameter))
else:
painter.drawEllipse(QRect(-diameter / 2,
-diameter / 2, diameter, diameter))
class Window(QWidget):
def __init__(self):
super().__init__()
aliased_label = self.create_label("Aliased")
antialiased_label = self.create_label("Antialiased")
int_label = self.create_label("Int")
float_label = self.create_label("Float")
layout = QGridLayout()
layout.addWidget(aliased_label, 0, 1)
layout.addWidget(antialiased_label, 0, 2)
layout.addWidget(int_label, 1, 0)
layout.addWidget(float_label, 2, 0)
timer = QTimer(self)
for i in range(2):
for j in range(2):
w = CircleWidget()
w.set_antialiased(j != 0)
w.set_float_based(i != 0)
timer.timeout.connect(w.next_animation_frame)
layout.addWidget(w, i + 1, j + 1)
timer.start(100)
self.setLayout(layout)
self.setWindowTitle("Concentric Circles")
def create_label(self, text):
label = QLabel(text)
label.setAlignment(Qt.AlignCenter)
label.setMargin(2)
label.setFrameStyle(QFrame.Box | QFrame.Sunken)
return label
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec())