def paintEvent(self, ev): self.resize(self.grid.size()) dpr = self.grid.devicePixelRatioF() buffer = QtGui.QPixmap(self.grid.width() * dpr, self.grid.height() * dpr) buffer.setDevicePixelRatio(dpr) buffer.fill(Qt.transparent) painter = QtGui.QPainter() def cell_to_radius(): for name, group in self.grid._groups.items(): for cell in group.cells: diameter = max((cell.width(), cell.height())) radius = diameter / 2 cell_rect = cell.rect() cell_rect.moveTopLeft(cell.pos()) center_pos = cell_rect.center() cx = center_pos.x() - radius cy = center_pos.y() - radius cell_rect = QtCore.QRectF(cx, cy, diameter, diameter) percent = self.cell_to_percentage.get(cell, 0.0) if percent > draw_threshold: percent = ((percent - draw_threshold) / (1 - draw_threshold)) yield cell, cell_rect, radius, percent painter.begin(buffer) painter.setRenderHint(painter.Antialiasing) painter.setBackgroundMode(Qt.TransparentMode) painter.fillRect(buffer.rect(), QtGui.QColor(0, 0, 0, 127)) pen_size = 40 try: max_percent = max(self.cell_to_percentage.values()) except ValueError: max_percent = 0.0 draw_threshold = max_percent * 0.8 for cell, cell_rect, radius, percent in cell_to_radius(): gradient = QtGui.QRadialGradient(cell_rect.center(), radius) if percent >= 0.95: color = (0, 1, 0, 1.0) else: color = (1, 1, 1, percent) gradient.setColorAt(0.7, QtGui.QColor.fromRgbF(*color)) gradient.setColorAt(1, QtGui.QColor.fromRgbF(0, 0, 0, 0)) brush = QtGui.QBrush(gradient) pen = QtGui.QPen(brush, pen_size) painter.setPen(pen) painter.drawEllipse(cell_rect) painter.setCompositionMode(painter.CompositionMode_Clear) painter.setPen(Qt.NoPen) painter.setBrush(Qt.transparent) for cell, cell_rect, radius, percent in cell_to_radius(): margin = max(((1.0 - percent) * (pen_size / 2), 5)) inner_ellipse = cell_rect.marginsRemoved( QtCore.QMarginsF(margin, margin, margin, margin)) painter.drawEllipse(inner_ellipse) painter.end() painter.begin(self) painter.setCompositionMode(painter.CompositionMode_SourceOver) painter.drawPixmap(self.rect(), buffer, buffer.rect()) painter.end()
def setup(self, size): dpi = widgets.DesktopWidget().logicalDpiX() self.setResolution(dpi) self.setPageMargins(QtCore.QMarginsF(0, 0, 0, 0)) self.setPageSizeMM( core.SizeF(size.width(), size.height()) / dpi * 25.4)