본문 바로가기
코딩취미/Python

PySide6에서 화면 로딩 중 마우스 포인터 변경하는 방법

by 브링블링 2025. 2. 20.
반응형

PySide6에서 화면 로딩 중 마우스 포인터 변경하는 방법

📝 소개

GUI 애플리케이션을 만들다 보면, 사용자가 버튼을 클릭했을 때 시간이 오래 걸리는 작업(예: 데이터 처리, 파일 로드 등)이 있을 수 있습니다. 이때 사용자는 프로그램이 멈춘 것처럼 보일 수도 있기 때문에 "로딩 중"이라는 시각적 피드백을 주는 것이 중요합니다. 이번 포스팅에서는 PySide6에서 화면 로딩 중 마우스 포인터의 형태를 변경하여 사용자 경험(UX)을 개선하는 방법을 정리했습니다.


🎯 목표

  • PySide6에서 마우스 포인터를 변경하는 방법을 배운다.
  • QApplication.setOverrideCursor()와 QApplication.restoreOverrideCursor()의 사용법을 익힌다.
  • 버튼 클릭 시 시간이 오래 걸리는 작업을 실행할 때 마우스 포인터를 로딩 상태(WaitCursor)로 변경하고, 작업 완료 후 원래 상태로 복원한다.

📌 마우스 포인터 변경하기

마우스 포인터를 로딩 상태로 변경하는 기본적인 과정은 다음과 같습니다.

  1. 긴 작업을 실행하기 전에 **QApplication.setOverrideCursor(Qt.WaitCursor)**를 호출하여 마우스 포인터를 로딩(회전하는 커서) 상태로 변경한다.
  2. 시간이 오래 걸리는 작업을 실행한다.
  3. 작업이 끝난 후 **QApplication.restoreOverrideCursor()**를 호출하여 원래의 마우스 포인터로 복원한다.

📌 예제 코드

아래는 버튼을 클릭하면 3초 동안 긴 작업을 실행하는 동안 마우스 포인터가 로딩 상태로 변경되는 코드입니다.

from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget
from PySide6.QtCore import QTimer
from PySide6.QtGui import Qt


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Mouse Pointer Example")
        self.resize(400, 300)

        # 버튼 생성
        self.button = QPushButton("Start Long Operation")
        self.button.clicked.connect(self.start_long_operation)

        # 레이아웃 설정
        layout = QVBoxLayout()
        layout.addWidget(self.button)

        container = QWidget()
        container.setLayout(layout)
        self.setCentralWidget(container)

    def start_long_operation(self):
        """긴 작업을 실행하는 동안 마우스 포인터 변경"""
        QApplication.setOverrideCursor(Qt.WaitCursor)  # 마우스 포인터 변경

        # 실제 긴 작업 (여기서는 QTimer로 3초간 대기)
        QTimer.singleShot(3000, self.end_long_operation)  # 3초 후 작업 완료

    def end_long_operation(self):
        """작업이 완료되면 마우스 포인터 복원"""
        QApplication.restoreOverrideCursor()  # 마우스 포인터 원래대로 복원


if __name__ == "__main__":
    import sys

    app = QApplication(sys.argv)

    # MainWindow 실행
    window = MainWindow()
    window.show()

    sys.exit(app.exec())
반응형

📌 코드 설명

단계 내용
1. QApplication.setOverrideCursor(Qt.WaitCursor) 마우스 포인터를 로딩 상태로 변경
2. QTimer.singleShot(3000, self.end_long_operation) 3초 동안 긴 작업을 시뮬레이션
3. QApplication.restoreOverrideCursor() 작업이 끝나면 마우스 포인터를 원래 상태로 복원

📌 실행 결과

✅ 버튼을 클릭하면 마우스 포인터가 "로딩(회전)" 상태로 변경됩니다.
3초 후 마우스 포인터가 원래 상태로 복원됩니다.
UI가 멈추지 않고 응답성을 유지하며, 사용자에게 작업이 진행 중이라는 시각적 피드백을 제공합니다.


📌 확장 가능성

위 코드에서는 QTimer를 사용하여 3초간 기다리도록 했지만, 실제로는 시간이 오래 걸리는 작업을 QThread를 사용하여 백그라운드에서 실행할 수 있습니다.

  • 비동기 작업 처리:
    • QThread를 사용하여 UI가 멈추지 않도록 한다.
    • 마우스 포인터는 QThread 작업이 끝날 때까지 WaitCursor 상태를 유지한다.
  • 다양한 마우스 포인터 스타일 적용:
    • Qt.ArrowCursor: 기본 화살표 커서
    • Qt.BusyCursor: 로딩 상태의 다른 스타일
    • Qt.CrossCursor: 십자형 커서 등

📌 주의할 점

  1. 마우스 포인터 복원을 잊지 말 것
    • QApplication.restoreOverrideCursor()를 호출하지 않으면 프로그램이 종료될 때까지 마우스 포인터가 계속 로딩 상태로 유지됩니다.
  2. 실제 긴 작업에서는 QThread 사용 고려
    • QTimer는 단순한 지연을 위한 것이며, 실제 데이터 처리나 복잡한 작업을 실행하려면 QThread 또는 QRunnable을 사용하는 것이 좋습니다.
반응형