AAT_Phase 1. GUI Programming using PyQt (1)

'졸업작품 (AAT)' 시리즈AAT_Phase 1. GUI Programming using PyQt (1)

mildsalmon

흔치않고, 진귀하다.

Sign in to view email

공부를 통해 새로 알게된 부분

  • PyQt

    • GUI 프로그래밍을 할 때 사용하는 대표적인 패키지 / anaconda에 PyQt5 버전이 기본 패키지
    • 구성요소
      • UI → 위젯 클래스의 객체를 생성해 만듬
      • 이벤트 루프 → QApplication 객체에서 exec_ 메서드를 호출해 이벤트 루프 생성
        • 사용자가 프로그램을 종료한다는 시그널을 보내기 전까지 시그널과 연결된 슬롯을 호출함으로써 이벤트 처리.
      • 이벤트를 처리할 함수 / 메서드 구현 → (시그널 → 슬롯)
        • 버튼 위젯을 클릭 → clicked 시그널(signal) 발생 → 슬롯(시그널이 발생했을 때 호출되는 함수 또는 메서드 / 콜백 함수(callback function)라고도 부름)
    • 위젯에서 발생하는 시그널에 대해 어떤 슬롯으로 처리할지에 대해 미리 등록 → 특정 위젯에서 시그널이 발생했을 때 이벤트 루프가 미리 연결된 슬롯을 자동으로 호출함.
    • MyWindow 객체 생성, UI 구성, 슬롯의 구현, 시그널 - 슬롯 연결 모두 이벤트 루프를 생성하는 .exec_() 메서드 호출보다 먼저 수행되야함.

    • 위젯의 종류에 따라 발생 가능한 기본 시그널이 정의.
    • 위젯은 UI를 구성하는 핵심 요소.
    • 모든 위젯이 최상위 위젯을 의미하는 윈도우가 될 수 있다. (but, 대부분의 프로그램은 QMainWindow, QDialog 클래스를 사용해 윈도우 생성.
    • QPushButton과 같은 객체 생성 코드를 모두 MyWindow 클래스의 생성자에 넣을 수도 있지만, 따로 메서드로 구성해서 코드의 가독성을 높인다.
    • btn1.clicked.connect(self.btn1_clicked)는 clicked(시그널)과 self.btn1_clicked(슬롯)을 연결하는 코드
    • 위젯
      • QPushButton
        • UI 구성시 가장 기본이 되는 위젯 / Y,N 같은 이벤트를 받는데 사용
        • 시그널
          • .clicked
      • QCoreApplication.instance()
        • app 변수가 바인딩하고 있는 동일한 객체(QApplication 클래스의 인스턴스)를 얻어옴.
        • 메서드
          • .quit (종료)
      • QLabel
        • 텍스트나 이미지 출력시 사용.
        • 인자값 = 1. 텍스트, 2. 부모
        • 메서드
          • .move(x,y) (객체가 출력되는 위치 조정), .resize(w,h) (크기 조정)
          • .setText (QLabel 객체에 텍스트 출력)
          • .clear (객체 텍스트 지우기)
      • QLineEdit
        • 사용자로부터 간단한 텍스트(한 줄)를 입력받을 때 사용.
        • 인자값 = 1. 텍스트, 2. 부모
        • 시그널
          • .textChanged (객체에서 텍스트가 변경될 때마다 발생)
          • .returnPressed (객체를 통해 사용자가 엔터를 눌렀을 때 발생)
        • 메서드
          • .text (사용자가 입력한 문자열을 얻는다)
      • QStatusBar
        • 어플리케이션의 상태를 알려주기 위해 어플리케이션의 하단에 위치하는 위젯
        • self.setStatusBar(self.statusBar)로 활성화.
        • 메서드
          • .showMessage (텍스트 출력)
      • QGroupBox
        • 제목이 있는 네모 박스 형태의 경계선을 만드는 데 사용
        • 메서드
          • .move(x,y) (객체가 출력되는 위치 조정), .resize(w,h) (크기 조정)
        • 인자값 = 1. 출력될 문자열, 2.위젯이 출력될 부모 위젯
      • QRadioButton
        • 사용자로부터 여러 가지 옵션 중 하나를 입력 받을 때 사용
        • 인자값 = 1. 출력될 문자열, 2.위젯이 출력될 부모 위젯
        • 메서드
          • .setChecked(True) (라디오 버튼의 초기 상태 설정)
          • .isChecked (버튼이 체크 되었는지 확인)
        • 시그널
          • .clicked
      • QCheckBox
        • 여러 옵션을 동시에 선택 가능.
        • 인자값 = 1. 표시될 텍스트, 2. 부모 위젯
        • .move(x,y) (객체가 출력되는 위치 조정), .resize(w,h) (크기 조정)
        • 시그널
          • .stateChanged (선택이 변경되는 경우 발생)
        • 메서드
          • .isChecked (위젯 객체가 선택된 상태인지 확인할 수 있음)
      • QSpinBox (정수값)
        • 화살표로 값을 증가 / 감소, 출력하는 부분으로 구성
        • 인자값 = 1. 부모
        • 메서드
          • .move(x,y) (객체가 출력되는 위치 조정), .resize(w,h) (크기 조정)
          • .setValue (초기값 설정)
          • .setSingleStep (증가 / 감소하는 값의 양 설정)
          • .setMinimum (값의 범위 지정 (최솟값))
          • .setMaximum ( '' (최댓값))
        • 시그널
          • .valueChanged (QSpinBox의 값이 변경될 때 자동으로 발생)
      • QTableWidget
        • 데이터를 행과 열로 표시해서 쉽게 파악할 수 있음.
        • 인자값 = 1. 부모
        • 메서드
          • .resize(w,h) (크기 조정)
          • .setRowCount (행의 갯수 지정)
          • .setColumnCount (열의 갯수 지정)
          • .setItem (QTableWidgetItem 객체 삽입)
            • 인자값 = 1. 행에 대한 인덱스, 2. 열에 대한 인덱스, 3. QTableWidgetItem 객체
          • .setEditTriggers ( QTableWidget의 아이템 항목을 수정할 수 없도록 설정) → self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
          • .setHorizontalHeaderLabels(컬럼 라벨) (column에 대한 라벨 설정)
          • .setVerticalHeaderLabels(로우 라벨) (Row에 대한 라벨 설정)
      • QTableWidgetItem
        • QTableWidget에 아이템으로 삽입하려면, 데이터를 QTableWidgetItem 객체로 만들어야함.
        • 메서드
          • .setTextAlignment(Qt.AlignVCenter | Qt.AlignRight) (우측 정렬)
  • Qt Designer

    • Qt의 컴포넌트를 이용해 GUI를 설계하는 전용 툴
    • ui(XML) → py
      • anaconda3\lib\site-packages\PyQt5\uic → 명령창 → python -m PyQt5.uic.pyioc -x name.ui -o name.py
        • ui 변경시마다 일일히 변환해야하고, 수정이 불편
      • 파이썬 코드 안에 ui파일을 파이썬 코드로 변환하는 모듈 추가해서 컨트롤 (MyWindow는 다중 상속)
        • from PyQt5 import uic / form_class = uic.loadUiType('name.ui')[0]
    • 이벤트 처리 → Qt Designer → Property Editor → objectName ⇒ 파이썬 코드에서 objectName으로 해당 객체에 접근.
  • Col 열 / Row 행

  • 메소드 = 클래스 내부에 위치한 함수, 함수 = 클래스 외부에 위치한 함수.

좀 더 공부해야하는 부분

  • PyQt 위젯 → 시그널, 메서드

한줄평

  • PyQt의 다양한 위젯에 당황했다. 시그널은 많이 알수록 활용도가 높아질 듯 하다. 일단 기초적으로 필기한거 위주로 사용해보고 Document를 보면서 시그널만 따로 블로그에 정리하는 것도 좋은 방법일 것 같다.

오늘 작성한 코드

learning signal of PyQt · mildsalmon/AAT@a896a52

작성된 댓글이 없습니다!
로그인된 사용자만 댓글을 작성할 수 있습니다.