def __init__(self, *args, **kwargs): self.__pixmap = None self.__moving = None self.__hover = None self.__focus = None self.__range = None self.__nSteps = self._defaultNSteps self.__snap = False self.__sliderIcons = { 'left': getKmapIcon('right_arrow'), 'right': getKmapIcon('left_arrow') } self.__sliders = OrderedDict([('left', Qt.QRect()), ('right', Qt.QRect())]) self.__values = {'left': None, 'right': None} self.__showRangeBackground = None # call the super constructor AFTER defining all members that # are used in the "paint" method super(RangeSlider, self).__init__(*args, **kwargs) self.setFocusPolicy(Qt.Qt.ClickFocus) self.__setupSliders() self.setMouseTracking(True) self.setMinimumSize(Qt.QSize(*self._defaultMinimumSize)) self.setMaximumHeight(self._defaultMaximumHeight) self.setSliderValues(None, None)
def __init__(self, parent=None): self.__pixmap = None self.__positionCount = None self.__firstValue = 0. self.__secondValue = 1. self.__minValue = 0. self.__maxValue = 1. self.__hoverRect = qt.QRect() self.__hoverControl = None self.__focus = None self.__moving = None self.__icons = { 'first': icons.getQIcon('previous'), 'second': icons.getQIcon('next') } # call the super constructor AFTER defining all members that # are used in the "paint" method super(RangeSlider, self).__init__(parent) self.setFocusPolicy(qt.Qt.ClickFocus) self.setAttribute(qt.Qt.WA_Hover) self.setMinimumSize(qt.QSize(50, 20)) self.setMaximumHeight(20) # Broadcast value changed signal self.sigValueChanged.connect(self.__emitPositionChanged)
def __sliderRect(self, name): """Returns rectangle corresponding to slider in pixels :param str name: 'first' or 'second' :rtype: QRect :raise ValueError: If wrong name """ assert name in ('first', 'second') if name == 'first': offset = -self._SLIDER_WIDTH position = self.getFirstPosition() elif name == 'second': offset = 0 position = self.getSecondPosition() else: raise ValueError('Unknown name') sliderArea = self.__sliderAreaRect() maxPos = self.__getCurrentPositionCount() - 1 xOffset = int((sliderArea.width() - 1) * position / maxPos) xPos = sliderArea.left() + xOffset + offset return qt.QRect(xPos, sliderArea.top(), self._SLIDER_WIDTH, sliderArea.height())
def __setupSliders(self): area = self.__sliderRect() height = area.height() width = self._sliderWidth template = Qt.QRect(area.left(), area.top(), width, height) self.__sliders['left'] = template.translated(width / -2, 0) self.__sliders['right'] = template.translated(width / 2, 0)
def __findHoverControl(self, pos): """Returns the control at the position and it's rect location""" for name in ["first", "second"]: rect = self.__sliderRect(name) if rect.contains(pos): return name, rect rect = self.__drawArea() if rect.contains(pos): return "groove", rect return None, qt.QRect()
def rasterText(text, font, size=-1, weight=-1, italic=False): """Raster text using Qt. It supports multiple lines. :param str text: The text to raster :param font: Font name or QFont to use :type font: str or :class:`QFont` :param int size: Font size in points Used only if font is given as name. :param int weight: Font weight in [0, 99], see QFont.Weight. Used only if font is given as name. :param bool italic: True for italic font (default: False). Used only if font is given as name. :return: Corresponding image in gray scale and baseline offset from top :rtype: (HxW numpy.ndarray of uint8, int) """ if not text: _logger.info("Trying to raster empty text, replaced by white space") text = ' ' # Replace empty text by white space to produce an image if not isinstance(font, qt.QFont): font = qt.QFont(font, size, weight, italic) metrics = qt.QFontMetrics(font) size = metrics.size(qt.Qt.TextExpandTabs, text) bounds = metrics.boundingRect(qt.QRect(0, 0, size.width(), size.height()), qt.Qt.TextExpandTabs, text) width = bounds.width() + 2 # Add extra border # align line size to 32 bits to ease conversion to numpy array width = 4 * ((width + 3) // 4) image = qt.QImage(width, bounds.height(), qt.QImage.Format_RGB888) # TODO if Qt5 use Format_Grayscale8 instead image.fill(0) # Raster text painter = qt.QPainter() painter.begin(image) painter.setPen(qt.Qt.white) painter.setFont(font) painter.drawText(bounds, qt.Qt.TextExpandTabs, text) painter.end() array = convertQImageToArray(image) # RGB to R array = numpy.ascontiguousarray(array[:, :, 0]) return array, metrics.ascent()
def paintEvent(self, pEvent): # get button geometry widgGeom = self.rect() paintGeom = qt.QRect(widgGeom.left() + 1, widgGeom.top() + 1, widgGeom.width() - 2, widgGeom.height() - 2) # paint background color painter = qt.QPainter(self) if self.brush is not None: painter.fillRect(paintGeom, self.brush) # paint frame pen = qt.QPen(qt.Qt.black) pen.setWidth(1 if not self.isCurrent() else 5) painter.setPen(pen) painter.drawRect(paintGeom) painter.end() qt.QPushButton.paintEvent(self, pEvent)
def createProcessingWidgetOverlay(parent): """Create a widget overlay to show that the application is processing data to update the plot. :param qt.QWidget widget: Widget containing the overlay :rtype: qt.QWidget """ if hasattr(parent, "centralWidget"): parent = parent.centralWidget() button = WaitingPushButton(parent) button.setWaiting(True) button.setText("Processing...") button.setDown(True) position = parent.size() size = button.sizeHint() position = (position - size) / 2 rect = qt.QRect(qt.QPoint(position.width(), position.height()), size) button.setGeometry(rect) button.setVisible(True) return button
def drawRangeSliderBackground(cls, painter, option, widget): """Draw the background of the RangeSlider widget into the painter. :param qt.QPainter painter: A painter :param StyleOptionRangeSlider option: Options to draw the widget :param qt.QWidget: The widget which have to be drawn """ painter.save() painter.translate(0.5, 0.5) backgroundRect = qt.QRect(option.rect) if backgroundRect.height() > 8: center = backgroundRect.center() backgroundRect.setHeight(8) backgroundRect.moveCenter(center) selectedRangeRect = qt.QRect(backgroundRect) selectedRangeRect.setLeft(option.handlerRect1.center().x()) selectedRangeRect.setRight(option.handlerRect2.center().x()) highlight = option.palette.color(qt.QPalette.Highlight) activeHighlight = highlight selectedOutline = option.palette.color(qt.QPalette.Highlight) buttonColor = option.palette.button().color() val = qt.qGray(buttonColor.rgb()) buttonColor = buttonColor.lighter(100 + max(1, (180 - val) // 6)) buttonColor.setHsv(buttonColor.hue(), buttonColor.saturation() * 0.75, buttonColor.value()) grooveColor = qt.QColor() grooveColor.setHsv(buttonColor.hue(), min(255, (int)(buttonColor.saturation())), min(255, (int)(buttonColor.value() * 0.9))) selectedInnerContrastLine = qt.QColor(255, 255, 255, 30) outline = option.palette.color(qt.QPalette.Background).darker(140) if (option.state & qt.QStyle.State_HasFocus and option.state & qt.QStyle.State_KeyboardFocusChange): outline = highlight.darker(125) if outline.value() > 160: outline.setHsl(highlight.hue(), highlight.saturation(), 160) # Draw background groove painter.setRenderHint(qt.QPainter.Antialiasing, True) gradient = qt.QLinearGradient() gradient.setStart(backgroundRect.center().x(), backgroundRect.top()) gradient.setFinalStop(backgroundRect.center().x(), backgroundRect.bottom()) painter.setPen(qt.QPen(outline)) gradient.setColorAt(0, grooveColor.darker(110)) gradient.setColorAt(1, grooveColor.lighter(110)) painter.setBrush(gradient) painter.drawRoundedRect(backgroundRect.adjusted(1, 1, -2, -2), 1, 1) # Draw slider background for the value gradient = qt.QLinearGradient() gradient.setStart(selectedRangeRect.center().x(), selectedRangeRect.top()) gradient.setFinalStop(selectedRangeRect.center().x(), selectedRangeRect.bottom()) painter.setRenderHint(qt.QPainter.Antialiasing, True) painter.setPen(qt.QPen(selectedOutline)) gradient.setColorAt(0, activeHighlight) gradient.setColorAt(1, activeHighlight.lighter(130)) painter.setBrush(gradient) painter.drawRoundedRect(selectedRangeRect.adjusted(1, 1, -2, -2), 1, 1) painter.setPen(selectedInnerContrastLine) painter.setBrush(qt.Qt.NoBrush) painter.drawRoundedRect(selectedRangeRect.adjusted(2, 2, -3, -3), 1, 1) painter.restore()
def paintEvent(self, event): painter = Qt.QPainter(self) style = Qt.QApplication.style() area = self.__drawArea() pixmapRect = self.__pixMapRect() sliders = self.__sliders option = Qt.QStyleOptionProgressBar() option.initFrom(self) option.rect = area option.state = ((self.isEnabled() and Qt.QStyle.State_Enabled) or Qt.QStyle.State_None) style.drawControl(Qt.QStyle.CE_ProgressBarGroove, option, painter, self) # showing interval rect only if show is forced or if there is not # background and show is True or None showRngBckgrnd = (self.__showRangeBackground or (self.__pixmap and self.__showRangeBackground) or (self.__pixmap is None and self.__showRangeBackground is None) or self.__showRangeBackground) alpha = (self.isEnabled() and 255) or 100 if showRngBckgrnd: painter.save() rect = Qt.QRect(area) rect.setLeft(sliders['left'].center().x()) rect.setRight(sliders['right'].center().x()) gradient = Qt.QLinearGradient(area.topLeft(), area.bottomLeft()) color = Qt.QColor(Qt.Qt.cyan) color.setAlpha(alpha) gradient.setColorAt(0., color) color = Qt.QColor(Qt.Qt.blue) color.setAlpha(alpha) gradient.setColorAt(1., color) brush = Qt.QBrush(gradient) painter.setBrush(brush) painter.drawRect(rect) painter.restore() if self.__pixmap and alpha == 255: painter.save() pen = painter.pen() pen.setWidth(2) pen.setColor(Qt.Qt.black) painter.setPen(pen) painter.drawRect(pixmapRect.adjusted(-1, -1, 1, 1)) painter.restore() painter.drawPixmap( area.adjusted(self._sliderWidth / 2, self._pixmapVOffset, -self._sliderWidth / 2, -self._pixmapVOffset), self.__pixmap, self.__pixmap.rect()) option = Qt.QStyleOptionButton() option.initFrom(self) for side, slider in sliders.items(): option.icon = self.__sliderIcons[side] option.iconSize = slider.size() * 0.7 if self.__hover == side: option.state |= Qt.QStyle.State_MouseOver elif option.state & Qt.QStyle.State_MouseOver: option.state ^= Qt.QStyle.State_MouseOver if self.__focus == side: option.state |= Qt.QStyle.State_HasFocus elif option.state & Qt.QStyle.State_HasFocus: option.state ^= Qt.QStyle.State_HasFocus option.rect = slider style.drawControl(Qt.QStyle.CE_PushButton, option, painter, self)
def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(1082, 758) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(":/logos/icon.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) MainWindow.setWindowIcon(icon) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.gridLayout_2 = QtWidgets.QGridLayout(self.centralwidget) self.gridLayout_2.setObjectName("gridLayout_2") self.gridLayout = QtWidgets.QGridLayout() self.gridLayout.setObjectName("gridLayout") self.filenameBox = QtWidgets.QLineEdit(self.centralwidget) sizePolicy = QtWidgets.QSizePolicy( QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.filenameBox.sizePolicy().hasHeightForWidth()) self.filenameBox.setSizePolicy(sizePolicy) self.filenameBox.setMinimumSize(QtCore.QSize(100, 0)) self.filenameBox.setBaseSize(QtCore.QSize(200, 0)) self.filenameBox.setPlaceholderText("") self.filenameBox.setObjectName("filenameBox") self.gridLayout.addWidget(self.filenameBox, 0, 0, 1, 1) self.browseButton = QtWidgets.QPushButton(self.centralwidget) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.browseButton.sizePolicy().hasHeightForWidth()) self.browseButton.setSizePolicy(sizePolicy) self.browseButton.setMaximumSize(QtCore.QSize(1000000, 16777215)) self.browseButton.setObjectName("browseButton") self.gridLayout.addWidget(self.browseButton, 0, 1, 1, 1) self.loadButton = QtWidgets.QPushButton(self.centralwidget) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.loadButton.sizePolicy().hasHeightForWidth()) self.loadButton.setSizePolicy(sizePolicy) self.loadButton.setMaximumSize(QtCore.QSize(10000, 16777215)) self.loadButton.setAutoDefault(True) self.loadButton.setDefault(True) self.loadButton.setObjectName("loadButton") self.gridLayout.addWidget(self.loadButton, 0, 2, 1, 1) self.gridLayout_2.addLayout(self.gridLayout, 0, 0, 1, 1) self.tabWidget = QtWidgets.QTabWidget(self.centralwidget) self.tabWidget.setFocusPolicy(QtCore.Qt.TabFocus) self.tabWidget.setObjectName("tabWidget") self.object = QtWidgets.QWidget() self.object.setObjectName("object") self.horizontalLayout = QtWidgets.QHBoxLayout(self.object) self.horizontalLayout.setObjectName("horizontalLayout") self.objectWidget = ObjectView(self.object) self.objectWidget.setObjectName("objectWidget") self.horizontalLayout.addWidget(self.objectWidget) self.tabWidget.addTab(self.object, "") self.probe = QtWidgets.QWidget() self.probe.setObjectName("probe") self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.probe) self.horizontalLayout_2.setObjectName("horizontalLayout_2") self.splitter_2 = QtWidgets.QSplitter(self.probe) self.splitter_2.setOrientation(QtCore.Qt.Horizontal) self.splitter_2.setObjectName("splitter_2") self.splitter = QtWidgets.QSplitter(self.splitter_2) self.splitter.setOrientation(QtCore.Qt.Vertical) self.splitter.setObjectName("splitter") self.probeHist = Histogram(self.splitter) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(1) sizePolicy.setVerticalStretch(1) sizePolicy.setHeightForWidth( self.probeHist.sizePolicy().hasHeightForWidth()) self.probeHist.setSizePolicy(sizePolicy) self.probeHist.setMinimumSize(QtCore.QSize(200, 200)) self.probeHist.setMaximumSize(QtCore.QSize(500, 16777215)) self.probeHist.setBaseSize(QtCore.QSize(0, 0)) self.probeHist.setObjectName("probeHist") self.layoutWidget = QtWidgets.QWidget(self.splitter) self.layoutWidget.setObjectName("layoutWidget") self.verticalLayout = QtWidgets.QVBoxLayout(self.layoutWidget) self.verticalLayout.setContentsMargins(0, 0, 0, 0) self.verticalLayout.setObjectName("verticalLayout") self.probePlot = ProbeView(self.layoutWidget) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(2) sizePolicy.setHeightForWidth( self.probePlot.sizePolicy().hasHeightForWidth()) self.probePlot.setSizePolicy(sizePolicy) self.probePlot.setMinimumSize(QtCore.QSize(0, 200)) self.probePlot.setMaximumSize(QtCore.QSize(500, 16777215)) self.probePlot.setObjectName("probePlot") self.verticalLayout.addWidget(self.probePlot) self.probePlot2 = ProbeView(self.layoutWidget) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(2) sizePolicy.setHeightForWidth( self.probePlot2.sizePolicy().hasHeightForWidth()) self.probePlot2.setSizePolicy(sizePolicy) self.probePlot2.setMinimumSize(QtCore.QSize(0, 200)) self.probePlot2.setMaximumSize(QtCore.QSize(500, 16777215)) self.probePlot2.setObjectName("probePlot2") self.verticalLayout.addWidget(self.probePlot2) self.layoutWidget1 = QtWidgets.QWidget(self.splitter_2) self.layoutWidget1.setObjectName("layoutWidget1") self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.layoutWidget1) self.verticalLayout_2.setContentsMargins(0, 0, 0, 0) self.verticalLayout_2.setObjectName("verticalLayout_2") self.gridLayout_3 = QtWidgets.QGridLayout() self.gridLayout_3.setObjectName("gridLayout_3") self.label = QtWidgets.QLabel(self.layoutWidget1) self.label.setObjectName("label") self.gridLayout_3.addWidget(self.label, 0, 0, 1, 1) self.backwardBox = QtWidgets.QSpinBox(self.layoutWidget1) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(1) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.backwardBox.sizePolicy().hasHeightForWidth()) self.backwardBox.setSizePolicy(sizePolicy) self.backwardBox.setMaximum(10000) self.backwardBox.setProperty("value", 1000) self.backwardBox.setObjectName("backwardBox") self.gridLayout_3.addWidget(self.backwardBox, 0, 1, 1, 1) self.label_3 = QtWidgets.QLabel(self.layoutWidget1) self.label_3.setObjectName("label_3") self.gridLayout_3.addWidget(self.label_3, 0, 3, 1, 1) self.forwardBox = QtWidgets.QSpinBox(self.layoutWidget1) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(1) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.forwardBox.sizePolicy().hasHeightForWidth()) self.forwardBox.setSizePolicy(sizePolicy) self.forwardBox.setMaximum(10000) self.forwardBox.setProperty("value", 1000) self.forwardBox.setObjectName("forwardBox") self.gridLayout_3.addWidget(self.forwardBox, 0, 4, 1, 1) self.propagateButton = QtWidgets.QPushButton(self.layoutWidget1) self.propagateButton.setObjectName("propagateButton") self.gridLayout_3.addWidget(self.propagateButton, 0, 9, 1, 1) self.label_2 = QtWidgets.QLabel(self.layoutWidget1) self.label_2.setObjectName("label_2") self.gridLayout_3.addWidget(self.label_2, 1, 0, 1, 1) self.focusButton = QtWidgets.QPushButton(self.layoutWidget1) self.focusButton.setObjectName("focusButton") self.gridLayout_3.addWidget(self.focusButton, 1, 9, 1, 1) spacerItem = QtWidgets.QSpacerItem(60, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout_3.addItem(spacerItem, 0, 2, 1, 1) spacerItem1 = QtWidgets.QSpacerItem(60, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout_3.addItem(spacerItem1, 0, 5, 1, 1) self.numberBox = QtWidgets.QSpinBox(self.layoutWidget1) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(1) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.numberBox.sizePolicy().hasHeightForWidth()) self.numberBox.setSizePolicy(sizePolicy) self.numberBox.setMaximum(1000) self.numberBox.setProperty("value", 200) self.numberBox.setObjectName("numberBox") self.gridLayout_3.addWidget(self.numberBox, 0, 7, 1, 1) self.label_4 = QtWidgets.QLabel(self.layoutWidget1) self.label_4.setObjectName("label_4") self.gridLayout_3.addWidget(self.label_4, 0, 6, 1, 1) spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout_3.addItem(spacerItem2, 0, 8, 1, 1) self.focusSlider = QtWidgets.QSlider(self.layoutWidget1) self.focusSlider.setOrientation(QtCore.Qt.Horizontal) self.focusSlider.setObjectName("focusSlider") self.gridLayout_3.addWidget(self.focusSlider, 1, 1, 1, 7) spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.gridLayout_3.addItem(spacerItem3, 1, 8, 1, 1) self.verticalLayout_2.addLayout(self.gridLayout_3) self.verticalFocusView = PropagationView(self.layoutWidget1) self.verticalFocusView.setMinimumSize(QtCore.QSize(200, 0)) self.verticalFocusView.setObjectName("verticalFocusView") self.verticalLayout_2.addWidget(self.verticalFocusView) self.horizontalFocusView = PropagationView(self.layoutWidget1) self.horizontalFocusView.setObjectName("horizontalFocusView") self.verticalLayout_2.addWidget(self.horizontalFocusView) self.horizontalLayout_2.addWidget(self.splitter_2) self.tabWidget.addTab(self.probe, "") self.fourier = QtWidgets.QWidget() self.fourier.setObjectName("fourier") self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.fourier) self.horizontalLayout_3.setObjectName("horizontalLayout_3") self.tabWidget.addTab(self.fourier, "") self.gridLayout_2.addWidget(self.tabWidget, 1, 0, 1, 1) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 1082, 22)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) self.tabWidget.setCurrentIndex(0) QtCore.QMetaObject.connectSlotsByName(MainWindow) MainWindow.setTabOrder(self.filenameBox, self.browseButton) MainWindow.setTabOrder(self.browseButton, self.loadButton) MainWindow.setTabOrder(self.loadButton, self.tabWidget)