Exemplo n.º 1
0
class DSnapshot(QDialog):
    """
    Snapshot dialog
    """
    def __init__(self, parent=None):
        """
        Constructor
        """
        QDialog.__init__(self, parent)

        self.state = 0

        self.posX = 0
        self.posY = 0
        self.posW = 0
        self.posH = 0

        self.setWindowFlags(Qt.Tool | Qt.FramelessWindowHint)
        self.setWindowFlags(self.windowFlags() | Qt.WindowStaysOnTopHint)

        # maximize window
        screen = QDesktopWidget().screenGeometry()
        self.setGeometry(screen)

        # set cross cursor
        self.setCursor(Qt.CursorShape(Qt.CrossCursor))

        # display
        self.show()

        # create rubberband
        self.rb = QRubberBand(QRubberBand.Rectangle)
        self.rb.setWindowOpacity(0.4)  # new in v18, to support pyqt5 properly

        self.snapshotResult = None

        layout = QVBoxLayout()

        self.backgroundLabel = QLabel()
        layout.addWidget(self.backgroundLabel)
        layout.setContentsMargins(0, 0, 0, 0)

        self.setLayout(layout)

    def setBackground(self, pixmap):
        """
        Set background
        """
        self.backgroundLabel.setPixmap(pixmap)

    def mousePressEvent(self, ev):
        """
        On mouse press event
        """
        if ev.button() != Qt.LeftButton:
            self.abort()

        if self.state == 0:
            self.state = 1
            self.origin = ev.globalPos()

            self.rb.setGeometry(
                QRect(self.origin, ev.globalPos()).normalized())
            self.rb.show()

    def mouseMoveEvent(self, ev):
        """
        On mouse move event
        """
        if self.state == 1:
            self.rb.setGeometry(
                QRect(self.origin, ev.globalPos()).normalized())

    def mouseReleaseEvent(self, ev):
        """
        On mouse release event
        """
        if self.state == 1:
            self.state = 2
            self.end = ev.globalPos()
            self.rb.hide()
            self.doSnip()

    def keyPressEvent(self, ev):
        """
        On key press event
        """
        if ev.key() == Qt.Key_Escape:
            self.abort()

    def doSnip(self):
        """
        Do snip
        """
        x = min(self.origin.x(), self.end.x())
        y = min(self.origin.y(), self.end.y())
        w = abs(self.origin.x() - self.end.x())
        h = abs(self.origin.y() - self.end.y())

        self.posX = x
        self.posY = y
        self.posW = w
        self.posH = h

        self.hide()
        if QtHelper.IS_QT5:
            pixmap = self.backgroundLabel.grab(QRect(x, y, w, h))
        else:
            pixmap = QPixmap.grabWidget(self.backgroundLabel, x, y, w, h)

        self.snapshotResult = pixmap
        self.accept()

    def getSnapshot(self):
        """
        Return snapshot as pixmap
        """
        return self.snapshotResult

    def getLocation(self):
        """
        Return snapshot as pixmap
        """
        return (self.posX, self.posY, self.posW, self.posH)

    def abort(self):
        """
        close both windows and exit program
        """
        pass