Exemple #1
0
    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()
Exemple #2
0
 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)