class ColorTransferFunctionIntervalView(QGraphicsRectItem): def __init__(self, viewer: ColorTransferFunctionViewer, begin_point: ColorTransferFunctionPoint, end_point: ColorTransferFunctionPoint, parent: QGraphicsItem = None): super().__init__(parent) self.viewer = viewer self._begin_point = None self._end_point = None self.chart = self.viewer.chart self.brush_gradient = QLinearGradient() self.brush_gradient.setStart(QPointF(0, 0)) self.brush_gradient.setFinalStop(QPointF(1, 0)) self.brush_gradient.setCoordinateMode(QGradient.ObjectMode) self.setPen(QColor('#404040')) self.begin_point = begin_point self.end_point = end_point @property def begin_point(self): return self._begin_point @begin_point.setter def begin_point(self, value): if self._begin_point != value: self._begin_point = value self._begin_point.x_changed.connect(self._on_point_x_changed) self._begin_point.color_array_changed.connect( self._on_begin_point_color_array_changed) self._update_begin_brush() @property def end_point(self): return self._end_point @end_point.setter def end_point(self, value): if self._end_point != value: self._end_point = value self._end_point.x_changed.connect(self._on_point_x_changed) self._end_point.color_array_changed.connect( self._on_end_point_color_array_changed) self._update_end_brush() def _on_point_x_changed(self, x: float): self.update() def _on_begin_point_color_array_changed(self, color_array: np.ndarray): self._update_begin_brush() def _on_end_point_color_array_changed(self, color_array: np.ndarray): self._update_end_brush() def _update_begin_brush(self): self.brush_gradient.setColorAt(0, self.begin_point.color) self.setBrush(self.brush_gradient) def _update_end_brush(self): self.brush_gradient.setColorAt(1, self.end_point.color) self.setBrush(self.brush_gradient) def update(self, rect: QRectF = QRectF()): super().update(rect) top_left_interval_pos = self.chart.mapToPosition( QPointF(self.begin_point.x, 1)) bottom_right_interval_pos = self.chart.mapToPosition( QPointF(self.end_point.x, 0)) self.setRect(QRectF(top_left_interval_pos, bottom_right_interval_pos)) def __lt__(self, other): return self.begin_point.x < other.begin_point.x
class SwitchPrivate(QObject): def __init__(self, q, parent=None, leftText='ON', rightText='OFF'): QObject.__init__(self, parent=parent) self.leftText = leftText self.rightText = rightText self.mPointer = q self.mPosition = 0.0 self.mGradient = QLinearGradient() self.mGradient.setSpread(QGradient.PadSpread) self.animation = QPropertyAnimation(self) self.animation.setTargetObject(self) self.animation.setPropertyName(b'position') self.animation.setStartValue(0.0) self.animation.setEndValue(1.0) self.animation.setDuration(200) self.animation.setEasingCurve(QEasingCurve.InOutExpo) self.animation.finished.connect(self.mPointer.update) @Property(float) def position(self): return self.mPosition @position.setter def position(self, value): self.mPosition = value self.mPointer.update() def draw(self, painter): r = self.mPointer.rect() margin = r.height() / 10 shadow = self.mPointer.palette().color(QPalette.Dark) light = self.mPointer.palette().color(QPalette.Light) button = self.mPointer.palette().color(QPalette.Button) painter.setPen(Qt.NoPen) self.mGradient.setColorAt(0, shadow.darker(130)) self.mGradient.setColorAt(1, light.darker(130)) self.mGradient.setStart(0, r.height()) self.mGradient.setFinalStop(0, 0) painter.setBrush(self.mGradient) painter.drawRoundedRect(r, r.height() / 2, r.height() / 2) self.mGradient.setColorAt(0, shadow.darker(140)) self.mGradient.setColorAt(1, light.darker(160)) self.mGradient.setStart(0, 0) self.mGradient.setFinalStop(0, r.height()) painter.setBrush(self.mGradient) painter.drawRoundedRect(r.adjusted(margin, margin, -margin, -margin), r.height() / 2, r.height() / 2) self.mGradient.setColorAt(0, button.darker(130)) self.mGradient.setColorAt(1, button) painter.setBrush(self.mGradient) x = r.height() / 2.0 + self.mPosition * (r.width() - r.height()) painter.drawEllipse(QPointF(x, r.height() / 2), r.height() / 2 - margin, r.height() / 2 - margin) text = self.leftText if bool(self.mPosition) else self.rightText painter.setPen(QColor(255, 255, 255)) font = QFont('Decorative', 10, QFont.Bold) fm = QFontMetrics(font) painter.setFont(font) textWidth = fm.width(text) textHeight = painter.font().pointSize() xpoint = r.width() - x - textWidth + 10 if bool( self.mPosition) else r.width() - x - 12 painter.drawText(QPointF(xpoint, r.height() / 2 + textHeight / 2), text) @Slot(bool, name='animate') def animate(self, checked): self.animation.setDirection(QPropertyAnimation.Forward if checked else QPropertyAnimation.Backward) self.animation.start()
xaxis.grid().setPen(QPen(QColor(140, 140, 140), 1, Qt.DotLine)) yaxis.grid().setPen(QPen(QColor(140, 140, 140), 1, Qt.DotLine)) xaxis.grid().setSubGridPen(QPen(QColor(80, 80, 80), 1, Qt.DotLine)) yaxis.grid().setSubGridPen(QPen(QColor(80, 80, 80), 1, Qt.DotLine)) xaxis.grid().setSubGridVisible(True) yaxis.grid().setSubGridVisible(True) xaxis.grid().setZeroLinePen(Qt.NoPen) yaxis.grid().setZeroLinePen(Qt.NoPen) lineEnd = QCPLineEnding.esSpikeArrow lineEnd2 = QCPLineEnding(QCPLineEnding.esSpikeArrow) xaxis.setUpperEnding(lineEnd2) yaxis.setUpperEnding(lineEnd2) plotGradient = QLinearGradient() plotGradient.setStart(0, 0) plotGradient.setFinalStop(0, 350) plotGradient.setColorAt(0, QColor(80, 80, 80)) plotGradient.setColorAt(1, QColor(50, 50, 50)) customPlot.setBackground(plotGradient) axisRectGradient = QLinearGradient() axisRectGradient.setStart(0, 0) axisRectGradient.setFinalStop(0, 350) axisRectGradient.setColorAt(0, QColor(80, 80, 80)) axisRectGradient.setColorAt(1, QColor(30, 30, 30)) customPlot.axisRect().setBackground(axisRectGradient) font = QtGui.QFont() font.setPointSize(12) color = QColor(Qt.white)
class GradientWidget(QLabel): def __init__(self, parent=None): super().__init__(parent) self.gradient = QLinearGradient(0, 0, 0, self.height()) self.labels = {} self.margin = 10 self._barThickness = 20 self._labelMargin = 2 self._maxLabelWidth = None self._maxLabelHeight = None self._orientation = 'Vertical' self.setStyleSheet("background-color: rgba(255,0,255,0)") self.setAttribute(Qt.WA_NoSystemBackground) def paintEvent(self, event): painter = QPainter(self) painter.setRenderHint(QPainter.HighQualityAntialiasing) # determine max width/height of all labels if self._maxLabelWidth is None or self._maxLabelHeight is None: self._maxLabelWidth = 0 self._maxLabelHeight = 0 for k in self.labels.values(): b = painter.boundingRect( QRectF(0, 0, 0, 0), int(Qt.AlignLeft) | int(Qt.AlignVCenter), str(k)) self._maxLabelWidth = max(self._maxLabelWidth, b.width()) self._maxLabelHeight = max(self._maxLabelHeight, b.height()) barRect = self.rect() if self._orientation == 'Vertical': # translate Y axis matrix = QMatrix() matrix.translate(0, self.height() - self.margin) matrix.scale(1, -1) painter.setMatrix(matrix) self.gradient.setFinalStop(0, self.height() - self.margin) barRect.setWidth(self._barThickness) barRect.setHeight(barRect.height() - 2 * self.margin) painter.fillRect(barRect, self.gradient) # restore normal coordinates painter.scale(1, -1) self.setMinimumWidth(self._barThickness + self._labelMargin + self._maxLabelWidth) elif self._orientation == 'Horizontal': self.margin = self._maxLabelWidth / 2 + self._labelMargin barRect.setHeight(self._barThickness) barRect.setLeft( self.margin ) # reduces width by margin (as opposed to shifting) # Reduce the width by another margin to pull off the right hand side barRect.setWidth(barRect.width() - self.margin) painter.fillRect(barRect, self.gradient) line_step = barRect.width() / 20 pos = barRect.left() while pos <= barRect.right(): painter.drawLine(pos, 2 * (barRect.bottom() - barRect.top()) / 3, pos, barRect.bottom()) pos += line_step self.setMinimumHeight(self._maxLabelHeight + self._barThickness + self._labelMargin) for pos, label in self.labels.items(): # Figure coordinate position. 1=height-margin for vertical, or width-margin for horizontal if self._orientation == 'Vertical': lpos = -1 * ((self.height() - (2 * self.margin)) * pos) painter.drawText(self._barThickness + self._labelMargin, (.5 * self._maxLabelHeight) + lpos, label) elif self._orientation == 'Horizontal': text_rect = painter.boundingRect(QRectF(0, 0, 0, 0), int(Qt.AlignLeft), str(label)) lpos = ((self.width() - (2 * self.margin)) * pos ) # Center position lleft = lpos - text_rect.width() / 2 painter.drawText(lleft + self.margin, self.height() - 1, label) def setGradient(self, g): self.gradient = g self.gradient.setCoordinateMode(QGradient.ObjectMode) # Make sure we go end-to-end self.gradient.setFinalStop(1, 0) self.gradient.setStart(0, 0) self.repaint() def setLabels(self, l): self.labels = l # recalculate self.labelWidth on next paint self._maxLabelWidth = None self._maxLabelHeight = None self.repaint() def setOrientation(self, orientation): if not orientation in ('Horizontal', 'Vertical'): raise TypeError( "Orientation must be one of 'Horizontal' or 'Vertical'") self._orientation = orientation self.repaint()