파이썬 토이 프로젝트 - Q&A [Pyqt]

지환·2023년 6월 1일
0

python

목록 보기
4/12

예제[어플리케이션 아이콘을 설정]

import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QIcon


class MyApp(QWidget):

  def __init__(self):
      super().__init__()
      self.initUI()

  def initUI(self):
      self.setWindowTitle('Icon')
      self.setWindowIcon(QIcon('web.png'))
      self.setGeometry(300, 300, 300, 200)
      self.show()


if __name__ == '__main__':
  app = QApplication(sys.argv)
  ex = MyApp()
  sys.exit(app.exec_())

어플리케이션 안에 아이콘 넣는 예제

구체적인 설명

self.setWindowIcon(QIcon('web.png'))
  • setWindowIcon() 메서드는 어플리케이션 아이콘을 설정하도록 합니다.

  • 이를 위해서 QIcon 객체를 생성하였습니다. QIcon()에 보여질 이미지('web.png')를 입력합니다.

  • 이미지 파일을 다른 폴더에 따로 저장해 둔 경우에는 경로까지 함께 입력해주면 됩니다.

self.setGeometry(300, 300, 300, 200)
  • setGeometry() 메서드는 창의 위치와 크기를 설정합니다.

  • 앞의 두 매개변수는 창의 x, y 위치를 결정하고, 뒤의 두 매개변수는 각각 창의 너비와 높이를 결정합니다.

  • 이 메서드는 창 띄우기 예제에서 사용했던 move()와 resize() 메서드를 하나로 합쳐놓은 것과 같습니다.

예제2) 창 닫기

## Ex 3-3. 창 닫기.

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
from PyQt5.QtCore import QCoreApplication


class MyApp(QWidget):

  def __init__(self):
      super().__init__()
      self.initUI()

  def initUI(self):
      btn = QPushButton('Quit', self)
      btn.move(50, 50)
      btn.resize(btn.sizeHint())
      btn.clicked.connect(QCoreApplication.instance().quit)

      self.setWindowTitle('Quit Button')
      self.setGeometry(300, 300, 300, 200)
      self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MyApp()
    sys.exit(app.exec_())

구체적인 설명

from PyQt5.QtCore import QCoreApplication
#QtCore 모듈의 QCoreApplication 클래스를 불러옵니다.
btn = QPushButton('Quit', self)
  • 푸시버튼을 하나 만듭니다.

  • 이 버튼 (btn)은 QPushButton 클래스의 인스턴스입니다.

  • 생성자 (QPushButton())의 첫 번째 파라미터에는 버튼에 표시될 텍스트를 입력하고, 두 번째 파라미터에는 버튼이 위치할 부모 위젯을 입력합니다.

  • 여기서 인스턴스에 대한 언급이 있었는데 클래스와 인스턴스의 차이가 무엇일까?

btn.clicked.connect(QCoreApplication.instance().quit)
  • PyQt5에서의 이벤트 처리는 시그널과 슬롯 메커니즘으로 이루어집니다.
    버튼 (btn)을 클릭하면 'clicked' 시그널이 만들어집니다.

  • instance() 메서드는 현재 인스턴스를 반환합니다.

  • 'clicked' 시그널은 어플리케이션을 종료하는 quit() 메서드에 연결됩니다.

  • 이렇게 발신자 (Sender)와 수신자 (Receiver), 두 객체 간에 커뮤니케이션이 이루어집니다.

  • 이 예제에서 발신자는 푸시버튼 (btn)이고, 수신자는 어플리케이션 객체 (app)입니다.

클래스와 인스턴스란 무엇인가?

>>> class Singer:                      # 가수를 정의하겠느니라…
...     def sing(self):                # 노래하기 메서드
...            return "Lalala~"
...    
>>> taeji = Singer()                   # 태지를 만들어랏!
>>> taeji.sing()                       # 노래 한 곡 부탁해요~
'Lalala~'

클래스를 만들 때는 위와 같이 class 클래스이름: 형식으로 시작해서 그 다음부터 그 클래스의 성질이나 행동을 정의해주면 됩니다. 둘째 줄에는 함수가 정의되어 있죠?

이와 같이 클래스 내부에 정의된 함수를 메서드(method)라고 부릅니다.

여기서 sing 메서드는 Singer라는 클래스가 하는 행동을 정의하고 있죠. Singer 클래스를 만든 다음에는 taeji라는 객체를 만들었습니다.

인스턴스명 = 클래스()와 같이 만들면 되죠.

그 다음엔 그렇게 만들어진 taeji에게 노래를 시켜봤습니다. Singer 클래스에 sing 메서드를 정의해줬기 때문에 Singer 클래스에 속한 taeji 객체도 sing 메서드를 사용할 수 있지요. 다시 말해서 가수는 노래할 수 있으니까 태지라는 가수도 역시 노래를 할 수 있는 것입니다. 이와 같이 어떤 객체의 메서드를 사용할 때는 객체.메서드 형식으로 해주시면 됩니다.

이번엔 같은 방법으로 리키 마틴 객체를 만들어서 노래를 청해보세요.

>>> ricky = Singer()
>>> ricky.sing()
'Lalala~'

내가 이해한 클래스 (부류) 인스턴스(다른 사람) 매서드 (행동)이다.

상태바만들기

  • 메인창은 QMenuBar, QToolBar, QDockWidget, QStatusBar를 위한 고유의 레이아웃을 갖고 있습니다.

  • 또한 가운데 영역에 중심위젯 (Central widget)을 위한 영역을 갖고 있습니다. 여기에는 어떠한 위젯도 들어올 수 있습니다.

  • QMainWindow 클래스를 이용해서 메인 어플리케이션 창을 만들 수 있습니다.

  • 우선 QStatusBar를 이용해서 메인 창에 상태바 (status bar)를 하나 만들어 보겠습니다.

  • 상태바는 어플리케이션의 상태를 알려주기 위해 어플리케이션의 하단에 위치하는 위젯입니다. (QStatusBar 공식 문서 참고)

  • 상태바에 텍스트를 표시하기 위해서는 showMessage() 메서드를 사용합니다.

  • 텍스트가 사라지게 하고 싶으면, clearMessage() 메서드를 사용하거나, showMessage() 메서드에 텍스트가 표시되는 시간을 설정할 수 있습니다.

  • 현재 상태바에 표시되는 메세지 텍스트를 갖고 오고 싶을 때는 currentMessage() 메서드를 사용합니다.

  • QStatusBar 클래스는 상태바에 표시되는 메세지가 바뀔 때 마다 messageChanged() 시그널을 발생합니다.

활용한예제[상태바만들기]

## Ex 3-5. 상태바 만들기.

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow


class MyApp(QMainWindow):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.statusBar().showMessage('Ready')

        self.setWindowTitle('Statusbar')
        self.setGeometry(300, 300, 300, 200)
        self.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MyApp()
    sys.exit(app.exec_())

이제 어플리케이션 창의 아래쪽에 상태바가 하나 표시됩니다.

self.statusBar().showMessage('Ready')
  • 상태바는 QMainWindow 클래스의 statusBar() 메서드를 이용해서 만드는데, statusBar() 메서드를 최초로 호출함으로써 만들어집니다.
  • 그 다음 호출부터는 상태바 객체를 반환합니다.
  • showMessage() 메서드를 통해 상태바에 보여질 메세지를 설정할 수 있습니다.

참고자료) https://wikidocs.net/21928

profile
아는만큼보인다.

0개의 댓글