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