import sys from utils.utils import resource_path from PyQt5.QtWidgets import QApplication, QWidget, QRubberBand, QMessageBox from PyQt5.QtCore import Qt, QRect, QPoint, QSize from PyQt5.QtGui import QGuiApplication, QCursor class SnippingWidget(QWidget): def __init__(self, mainwindow): super().__init__() self.setWindowTitle("Screen Snipper") self.parent = mainwindow self.setWindowIcon(self.parent.icon) self.rectMode = True # ✅ 최상단 유지 및 입력 포커스 확보 self.setWindowFlags( Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint | Qt.SplashScreen # ✅ 최상단 유지 및 입력 포커스 확보 ) self.setWindowOpacity(0.3) # ✅ 창을 불투명하게 유지 self.setAttribute(Qt.WA_NoSystemBackground, False) # ✅ 배경 활성화 self.clipboard = QApplication.clipboard() # ✅ 전체 화면 설정 screen_geometry = QGuiApplication.primaryScreen().geometry() self.setGeometry(screen_geometry) self.activateWindow() self.raise_() # ✅ 드래그 초기화 self.origin = QPoint() self.rubberBand = QRubberBand(QRubberBand.Rectangle, self) def showEvent(self, event): self.setCursor(Qt.CrossCursor) # ✅ 십자 모양 커서로 변경 super().showEvent(event) def closeEvent(self, event): self.unsetCursor() super().closeEvent(event) def mousePressEvent(self, event): if event.button() == Qt.LeftButton: if self.rectMode == True: self.origin = event.pos() self.rubberBand.setGeometry(QRect(self.origin, QSize())) self.rubberBand.show() event.accept() def mouseMoveEvent(self, event): if self.rectMode == True: if not self.origin.isNull(): rect = QRect(self.origin, event.pos()).normalized() self.rubberBand.setGeometry(rect) event.accept() def mouseReleaseEvent(self, event): if event.button() == Qt.LeftButton: """ Button Coordinate Setting Mode """ if self.rectMode == False: pos = event.pos() btn_x, btn_y = pos.x(), pos.y() self.parent.coords["btn_x"] = btn_x self.parent.coords["btn_y"] = btn_y self.parent.update_btn_coord() self.close_overlay() QMessageBox.information( self, "버튼 좌표 지정 완료", f"x: {btn_x}, y: {btn_y}", ) """ Snipping Area Setting Mode """ if self.rectMode == True: selected_rect = self.rubberBand.geometry() self.rubberBand.hide() QApplication.processEvents() self.close_overlay() # 멀티 모니터 지원 screen = QGuiApplication.screenAt(event.globalPos()) if not screen: screen = QGuiApplication.primaryScreen() # screenshot = screen.grabWindow( # 0, # selected_rect.x(), # selected_rect.y(), # selected_rect.width(), # selected_rect.height(), # ) # # ✅ 캡처 이미지 저장 및 클립보드 복사 # screenshot.save("screenshot.png", "PNG") # self.clipboard.setPixmap(screenshot) x, y, w, h = selected_rect.getRect() self.parent.coords["x"] = x self.parent.coords["y"] = y self.parent.coords["w"] = w self.parent.coords["h"] = h self.parent.update_rect_coords() QMessageBox.information( self, "영역 지정 완료", f"x: {x}, y: {y}, width: {w}, height: {h}", ) def close_overlay(self): self.origin = QPoint() self.close() def keyPressEvent(self, event): if event.key() == Qt.Key_Escape: self.rubberBand.hide() self.origin = QPoint() self.close() event.accept()