def paintEvent(self, event): log_rect = QRectF(self.rect()) log_rect.setHeight(self.getLogHeight()) cmd_rect = QRectF(self.rect()) cmd_rect.setY(self.getLogHeight()) cmd_rect.setWidth(cmd_rect.width() - self.getButtonWidth()) cmd_rect.setHeight(self.getCommandHeight()) btn_rect = QRectF(cmd_rect) btn_rect.setX(btn_rect.width()) btn_rect.setWidth(self.getButtonWidth()) self.log.setGeometry(*log_rect.getRect()) self.cmd.setGeometry(*cmd_rect.getRect()) self.btn.setGeometry(*btn_rect.getRect())
def remember_selected_rect_params(self): pos_scene = self.view.mapToScene(self.rubber_band.pos()) rect_scene = self.view.mapToScene( self.rubber_band.rect()).boundingRect() downsample = self.slide_helper.get_downsample_for_level( self.slide_view_params.level) selected_qrectf_0_level = QRectF(pos_scene * downsample, rect_scene.size() * downsample) self.slide_view_params.selected_rect_0_level = selected_qrectf_0_level.getRect( )
def scroll_to_index(view_cls, idx, select=True): old_value = view_cls.verticalScrollBar().value() view_cls.setUpdatesEnabled(False) view_cls.verticalScrollBar().setValue(0) idx_rect = view_cls.visualRect(idx) view_cls.verticalScrollBar().setValue(old_value) view_cls.setUpdatesEnabled(True) rect = QRectF(idx_rect) if app_constants.DEBUG: print("Scrolling to index:", rect.getRect()) view_cls.k_scroller.ensureVisible(rect, 0, 0) if select: view_cls.setCurrentIndex(idx)
class MyGraphicsView(QGraphicsView): def __init__(self, central_widget): super().__init__(central_widget) self.widget = central_widget self.start = [0, 0] self.end = [0, 0] self.my_scene = QGraphicsScene() self.rect = QRectF() self.old_rect_item = None self.old_img_item = None self.drawing = False def mousePressEvent(self, event): self.start = [event.x(), event.y()] self.drawing = True def mouseMoveEvent(self, event): if not self.drawing: return self.end = [event.x(), event.y()] temp_start = [min(self.start[0], self.end[0]), min(self.start[1], self.end[1])] temp_end = [max(self.start[0], self.end[0]), max(self.start[1], self.end[1])] if self.old_rect_item: self.my_scene.removeItem(self.old_rect_item) self.rect.setRect(temp_start[0], temp_start[1], temp_end[0] - temp_start[0], temp_end[1] - temp_start[1]) self.old_rect_item = self.my_scene.addRect(self.rect, QPen(Qt.red, 1, Qt.SolidLine)) self.setScene(self.my_scene) # 释放鼠标 def mouseReleaseEvent(self, event): print('start:[{}, {}]'.format(self.start[0], self.start[1])) print('end:[{}, {}]'.format(self.end[0], self.end[1])) print(self.rect.getRect()) self.drawing = False
class Callout(QGraphicsItem): def __init__(self, chart): super(Callout, self).__init__(chart) self.chart = chart self.m_font = QFont() self.m_anchor = QPointF() self.m_rect = QRectF() self.m_textRect = QRectF() self.m_text = "" self.leftclick = False def boundingRect(self): anchor = self.mapFromParent(self.chart.mapToPosition(self.m_anchor)) rect = QRectF() rect.setLeft(min(self.m_rect.left(), anchor.x())) rect.setRight(max(self.m_rect.right(), anchor.x())) rect.setTop(min(self.m_rect.top(), anchor.y())) rect.setBottom(max(self.m_rect.bottom(), anchor.y())) return rect def paint(self, painter, option, widget): path = QPainterPath() x, y, w, d = self.m_rect.getRect() self.m_rect = QRectF(x, y, w, d) path.addRoundedRect(self.m_rect, 5, 5) anchor = self.mapFromParent(self.chart.mapToPosition(self.m_anchor)) if not self.m_rect.contains(QPoint(int(anchor.x()), int(anchor.y()))): point1 = QPointF() point2 = QPointF() above = anchor.y() <= self.m_rect.top() aboveCenter = anchor.y() > self.m_rect.top() and anchor.y( ) <= self.m_rect.center().y() belowCenter = anchor.y() > self.m_rect.center().y() and anchor.y( ) <= self.m_rect.bottom() below = anchor.y() > self.m_rect.bottom() onLeft = anchor.x() <= self.m_rect.left() leftOfCenter = anchor.x() > self.m_rect.left() and anchor.x( ) <= self.m_rect.center().x() rightOfCenter = anchor.x() > self.m_rect.center().x() and anchor.x( ) <= self.m_rect.right() onRight = anchor.x() > self.m_rect.right() #get the nearest m_rect corner x = (onRight + rightOfCenter) * self.m_rect.width() y = (below + belowCenter) * self.m_rect.height() cornerCase = (above and onLeft) or (above and onRight) or ( below and onLeft) or (below and onRight) vertical = abs(anchor.x() - x) > abs(anchor.y() - y) x1 = x + leftOfCenter * 10 - rightOfCenter * 20 + cornerCase * ( not vertical) * (onLeft * 10 - onRight * 20) y1 = y + aboveCenter * 10 - belowCenter * 20 + cornerCase * vertical * ( above * 10 - below * 20) point1.setX(x1) point1.setY(y1) x2 = x + leftOfCenter * 20 - rightOfCenter * 10 + cornerCase * ( not vertical) * (onLeft * 20 - onRight * 10) y2 = y + aboveCenter * 20 - belowCenter * 10 + cornerCase * vertical * ( above * 20 - below * 10) point2.setX(x2) point2.setY(y2) path.moveTo(point1) path.lineTo(anchor) path.lineTo(point2) path = path.simplified() painter.setBrush(QColor(255, 255, 255)) painter.drawPath(path) painter.drawText(self.m_textRect, Qt.AlignLeft, self.m_text) def mousePressEvent(self, event): event.setAccepted(True) def mouseMoveEvent(self, event): if (event.buttons() == Qt.LeftButton): self.setPos( self.mapToParent(event.pos() - event.buttonDownPos(Qt.LeftButton))) event.setAccepted(True) else: event.setAccepted(False) def setText(self, text): self.m_text = text metrics = QFontMetrics(self.m_font) self.m_textRect = metrics.boundingRect(QRect(0, 0, 150, 150), Qt.AlignLeft, self.m_text) self.m_textRect.translate(5, 5) self.prepareGeometryChange() self.m_rect = self.m_textRect.adjusted(-5, -5, 5, 5) def setAnchor(self, point): self.m_anchor = point def updateGeometry(self): self.prepareGeometryChange() self.setPos(self.chart.mapToPosition(self.m_anchor) + QPoint(10, -50))
def qrectf_to_json(val: QRectF): return json.dumps(val.getRect())