Exemplo n.º 1
0
 def getRectangle(self, beginPoint, endPoint):
     pickRectWidth = int(qAbs(beginPoint.x() - endPoint.x()))
     pickRectHeight = int(qAbs(beginPoint.y() - endPoint.y()))
     pickRectTop = beginPoint.x() if beginPoint.x() < endPoint.x() else endPoint.x()
     pickRectLeft = beginPoint.y() if beginPoint.y() < endPoint.y() else endPoint.y()
     pickRect = QRect(pickRectTop, pickRectLeft, pickRectWidth, pickRectHeight)
     # 避免高度宽度为0时候报错
     if pickRectWidth == 0:
         pickRect.setWidth(2)
     if pickRectHeight == 0:
         pickRect.setHeight(2)
     return pickRect
Exemplo n.º 2
0
 def get_rect(self, beginPoint, endPoint):
     width = qAbs(beginPoint.x() - endPoint.x())
     height = qAbs(beginPoint.y() - endPoint.y())
     x = beginPoint.x() if beginPoint.x() < endPoint.x() else endPoint.x()
     y = beginPoint.y() if beginPoint.y() < endPoint.y() else endPoint.y()
     selected_rect = QRect(x, y, width, height)
     # 避免宽或高为零时拷贝截图有误
     # 可以看QQ截图,当选取截图宽或高为零时默认为2
     if selected_rect.width() == 0:
         selected_rect.setWidth(1)
     if selected_rect.height() == 0:
         selected_rect.setHeight(1)
     return selected_rect
Exemplo n.º 3
0
    def getRect(self):
        width = qAbs(self.m_beginPoint.x() - self.m_endPoint.x())
        height = qAbs(self.m_beginPoint.y() - self.m_endPoint.y())
        x = self.m_beginPoint.x() if self.m_beginPoint.x() < self.m_endPoint.x(
        ) else self.m_endPoint.x()
        y = self.m_beginPoint.y() if self.m_beginPoint.y() < self.m_endPoint.y(
        ) else self.m_endPoint.y()

        selectedRect = QRect(x, y, width, height)
        if selectedRect.width() == 0:
            selectedRect.setWidth(1)
        if selectedRect.height() == 0:
            selectedRect.setHeight(1)
        return selectedRect
Exemplo n.º 4
0
    def timerEvent(self):
        # Don't move too far away.
        lineToCenter = QLineF(QPointF(0, 0), self.mapFromScene(0, 0))
        if lineToCenter.length() > 150:
            angleToCenter = math.acos(lineToCenter.dx() / lineToCenter.length())
            if lineToCenter.dy() < 0:
                angleToCenter = Mouse.TwoPi - angleToCenter;
            angleToCenter = Mouse.normalizeAngle((Mouse.Pi - angleToCenter) + Mouse.Pi / 2)

            if angleToCenter < Mouse.Pi and angleToCenter > Mouse.Pi / 4:
                # Rotate left.
                self.angle += [-0.25, 0.25][self.angle < -Mouse.Pi / 2]
            elif angleToCenter >= Mouse.Pi and angleToCenter < (Mouse.Pi + Mouse.Pi / 2 + Mouse.Pi / 4):
                # Rotate right.
                self.angle += [-0.25, 0.25][self.angle < Mouse.Pi / 2]
        elif math.sin(self.angle) < 0:
            self.angle += 0.25
        elif math.sin(self.angle) > 0:
            self.angle -= 0.25

        # Try not to crash with any other mice.
        dangerMice = self.scene().items(QPolygonF([self.mapToScene(0, 0),
                                                         self.mapToScene(-30, -50),
                                                         self.mapToScene(30, -50)]))

        for item in dangerMice:
            if item is self:
                continue
        
            lineToMouse = QLineF(QPointF(0, 0), self.mapFromItem(item, 0, 0))
            angleToMouse = math.acos(lineToMouse.dx() / lineToMouse.length())
            if lineToMouse.dy() < 0:
                angleToMouse = Mouse.TwoPi - angleToMouse
            angleToMouse = Mouse.normalizeAngle((Mouse.Pi - angleToMouse) + Mouse.Pi / 2)

            if angleToMouse >= 0 and angleToMouse < Mouse.Pi / 2:
                # Rotate right.
                self.angle += 0.5
            elif angleToMouse <= Mouse.TwoPi and angleToMouse > (Mouse.TwoPi - Mouse.Pi / 2):
                # Rotate left.
                self.angle -= 0.5

        # Add some random movement.
        if len(dangerMice) > 1 and (qrand() % 10) == 0:
            if qrand() % 1:
                self.angle += (qrand() % 100) / 500.0
            else:
                self.angle -= (qrand() % 100) / 500.0

        self.speed += (-50 + qrand() % 100) / 100.0

        dx = math.sin(self.angle) * 10
        self.mouseEyeDirection = 0.0 if qAbs(dx / 5) < 1 else dx / 5

        self.setRotation(self.rotation() + dx)
        self.setPos(self.mapToParent(0, -(3 + math.sin(self.speed) * 3)))
Exemplo n.º 5
0
    def calculate_forces(self):
        if not self.scene() or self.scene().mouseGrabberItem() is self:
            self.newPos = self.pos()
            return

        # Sum up all forces pushing this item away.
        xvel = 0.0
        yvel = 0.0
        for item in self.scene().items():
            if not isinstance(item, Node):
                continue

            line = QLineF(self.mapFromItem(item, 0, 0), QPointF(0, 0))
            dx = line.dx()
            dy = line.dy()
            l = 2.0 * (dx * dx + dy * dy)
            if l > 0:
                xvel += (dx * 150.0) / l
                yvel += (dy * 150.0) / l

        # Now subtract all forces pulling items together.
        weight = (len(self.edgeList) + 1) * 10.0
        for edge in self.edgeList:
            if edge.source_node() is self:
                pos = self.mapFromItem(edge.destination_node(), 0, 0)
            else:
                pos = self.mapFromItem(edge.source_node(), 0, 0)
            xvel += pos.x() / weight
            yvel += pos.y() / weight

        if qAbs(xvel) < 0.1 and qAbs(yvel) < 0.1:
            xvel = yvel = 0.0

        sceneRect = self.scene().sceneRect()
        self.newPos = self.pos() + QPointF(xvel, yvel)
        self.newPos.setX(
            min(max(self.newPos.x(),
                    sceneRect.left() + 10),
                sceneRect.right() - 10))
        self.newPos.setY(
            min(max(self.newPos.y(),
                    sceneRect.top() + 10),
                sceneRect.bottom() - 10))
Exemplo n.º 6
0
    def calculateForces(self):
        if not self.scene() or self.scene().mouseGrabberItem() is self:
            self.newPos = self.pos()
            return
    
        # Sum up all forces pushing this item away.
        xvel = 0.0
        yvel = 0.0
        for item in self.scene().items():
            if not isinstance(item, Node):
                continue

            line = QLineF(self.mapFromItem(item, 0, 0), QPointF(0, 0))
            dx = line.dx()
            dy = line.dy()
            l = 2.0 * (dx * dx + dy * dy)
            if l > 0:
                xvel += (dx * 150.0) / l
                yvel += (dy * 150.0) / l

        # Now subtract all forces pulling items together.
        weight = (len(self.edgeList) + 1) * 10.0
        for edge in self.edgeList:
            if edge.sourceNode() is self:
                pos = self.mapFromItem(edge.destNode(), 0, 0)
            else:
                pos = self.mapFromItem(edge.sourceNode(), 0, 0)
            xvel += pos.x() / weight
            yvel += pos.y() / weight
    
        if qAbs(xvel) < 0.1 and qAbs(yvel) < 0.1:
            xvel = yvel = 0.0

        sceneRect = self.scene().sceneRect()
        self.newPos = self.pos() + QPointF(xvel, yvel)
        self.newPos.setX(min(max(self.newPos.x(), sceneRect.left() + 10), sceneRect.right() - 10))
        self.newPos.setY(min(max(self.newPos.y(), sceneRect.top() + 10), sceneRect.bottom() - 10))
Exemplo n.º 7
0
 def handleWheelDelta(self, delta):
     if (delta <= -120):
         self.zoomOut()
     elif (delta >= 120):
         self.zoomIn()
     else:
         # We're dealing with a finer-resolution mouse. Allow it to have finer
         # control over the zoom level.
         factor = 1 + 0.3 * qAbs(delta / 8 / 15)
         if (delta < 0):
             factor = 1 / factor
         scale = qBound(self.mZoomFactors.first(), self.mScale * factor,
                        self.mZoomFactors.back())
         # Round to at most four digits after the decimal point
         self.setScale(math.floor(scale * 10000 + 0.5) / 10000)
Exemplo n.º 8
0
 def handleWheelDelta(self, delta):
     if (delta <= -120):
         self.zoomOut()
     elif (delta >= 120):
         self.zoomIn()
     else:
         # We're dealing with a finer-resolution mouse. Allow it to have finer
         # control over the zoom level.
         factor = 1 + 0.3 * qAbs(delta / 8 / 15)
         if (delta < 0):
             factor = 1 / factor
         scale = qBound(self.mZoomFactors.first(),
                              self.mScale * factor,
                              self.mZoomFactors.back())
         # Round to at most four digits after the decimal point
         self.setScale(math.floor(scale * 10000 + 0.5) / 10000)
Exemplo n.º 9
0
    def timerEvent(self):
        # Don't move too far away.
        lineToCenter = QLineF(QPointF(0, 0), self.mapFromScene(0, 0))
        if lineToCenter.length() > 150:
            angleToCenter = math.acos(lineToCenter.dx() /
                                      lineToCenter.length())
            if lineToCenter.dy() < 0:
                angleToCenter = Mouse.TwoPi - angleToCenter
            angleToCenter = Mouse.normalizeAngle((Mouse.Pi - angleToCenter) +
                                                 Mouse.Pi / 2)

            if angleToCenter < Mouse.Pi and angleToCenter > Mouse.Pi / 4:
                # Rotate left.
                self.angle += [-0.25, 0.25][self.angle < -Mouse.Pi / 2]
            elif angleToCenter >= Mouse.Pi and angleToCenter < (
                    Mouse.Pi + Mouse.Pi / 2 + Mouse.Pi / 4):
                # Rotate right.
                self.angle += [-0.25, 0.25][self.angle < Mouse.Pi / 2]
        elif math.sin(self.angle) < 0:
            self.angle += 0.25
        elif math.sin(self.angle) > 0:
            self.angle -= 0.25

        # Try not to crash with any other mice.
        dangerMice = self.scene().items(
            QPolygonF([
                self.mapToScene(0, 0),
                self.mapToScene(-30, -50),
                self.mapToScene(30, -50)
            ]))

        for item in dangerMice:
            if item is self:
                continue

            lineToMouse = QLineF(QPointF(0, 0), self.mapFromItem(item, 0, 0))
            angleToMouse = math.acos(lineToMouse.dx() / lineToMouse.length())
            if lineToMouse.dy() < 0:
                angleToMouse = Mouse.TwoPi - angleToMouse
            angleToMouse = Mouse.normalizeAngle((Mouse.Pi - angleToMouse) +
                                                Mouse.Pi / 2)

            if angleToMouse >= 0 and angleToMouse < Mouse.Pi / 2:
                # Rotate right.
                self.angle += 0.5
            elif angleToMouse <= Mouse.TwoPi and angleToMouse > (Mouse.TwoPi -
                                                                 Mouse.Pi / 2):
                # Rotate left.
                self.angle -= 0.5

        # Add some random movement.
        if len(dangerMice) > 1 and (qrand() % 10) == 0:
            if qrand() % 1:
                self.angle += (qrand() % 100) / 500.0
            else:
                self.angle -= (qrand() % 100) / 500.0

        self.speed += (-50 + qrand() % 100) / 100.0

        dx = math.sin(self.angle) * 10
        self.mouseEyeDirection = 0.0 if qAbs(dx / 5) < 1 else dx / 5

        self.setRotation(self.rotation() + dx)
        self.setPos(self.mapToParent(0, -(3 + math.sin(self.speed) * 3)))