위젯과 레이아웃
위젯, Buttons / Radio Button
- 단계 1. UI 파일 생성 – QRadioButton 위젯 3 개를 Dialog 창에 올려 놓기
- 단계 1 – 0 : 과거 작업하던 Dialog 창은 저장 후 종료
- 단계 1.1 – 새 폼 생성
- 메뉴에서 파일/새 폼 선택
- 단계 1.2 – 새 Dialog 창 생성
- 새 폼 창에서 Dialog without Buttons 더블 크릭
- 단계 1.3 – Dialog 창에 Containers / Group Box를 배치 후 적당한 크기로 변경
- Group Box 위젯의 title 속성 값을 ‘Radio Button Group’로 변경
- Group Box 위젯의 objectName은 주어진 ‘goupBox’임을 확인(변경할 필요 없음)
- 단계 1.3 – 위젯, Buttons / Radio Button 3개를 Group Box 위젯 안에 배치 및 설정
- 각각 위젯의 text 속성은 ‘RadioButton A’, ‘‘RadioButton B, ‘RadioButton C’로 설정
- 각각의 ObjectName 속성은 ‘rbtnA’, ‘rbtnB’, ‘rbtnC’ 로 설정
- 위젯의 폭(width) 설정
- 속성 편집기를 이용하여 두 위젯 모두 ‘geometry/너비’ 속성 값을 110으로 변경
- 단계 1.4 – UI 파일 저장
- 메뉴에서 파일/저장 선택 또는 ctrl + s
- 파일 이름 예, RadioButtons.ui
- 메뉴에서 파일/저장 선택 또는 ctrl + s
# 파일 이름 : PushButtons.py
import sys
from PyQt5.QtWidgets import *
from PyQt5 import uic
form_class = uic.loadUiType("RadioButtons.ui")[0]
class WindowClass(QMainWindow, form_class) :
def __init__(self) :
super().__init__()
self.setupUi(self)
#GroupBox안에 있는 RadioButton들을 연결
self.rbtnA.clicked.connect(self.gpRbtnFunction)
self.rbtnB.clicked.connect(self.gpRbtnFunction)
self.rbtnC.clicked.connect(self.gpRbtnFunction)
#btnA에 클릭 이벤트가 발생하면 작동할 함수
def gpRbtnFunction(self) :
if self.rbtnA.isChecked() : print("RadioButton A Chekced")
elif self.rbtnB.isChecked() : print("RadioButton B Checked")
elif self.rbtnC.isChecked() : print("Radiobutton C Checked")
if __name__ == "__main__" :
app = QApplication(sys.argv)
myWindow = WindowClass()
myWindow.show()
app.exec_()
위젯, Buttion / QCheckBox
- 단계 1. UI 파일 생성 – QCheckBox 위젯 후 종료
- 단계 1.1 – 새 폼 생성
- 메뉴에서 파일/새 폼 선택
- 단계 1.2 – 새 Dialog 창 생성
- 새 폼 창에서 Dialog without Buttons 더블 크릭
- 단계 1.3 – CheckBox를 옆 그림과 같이 배치
- GroupBox 내에 두 개의 CheckBox
- Object Name : groupChkBox1, groupChkBox2
- GroupBox 없이 두 개의 CheckBox
- Object Name : chkBox1, chkBox2
- GroupBox 내에 두 개의 CheckBox
- 단계 1.4 – UI 파일 저장
- 메뉴에서 파일/저장 선택 또는 ctrl + s
- 파일 이름 예, checkboxTest.ui
- 메뉴에서 파일/저장 선택 또는 ctrl + s
- 단계 1.1 – 새 폼 생성
import sys
from PyQt5.QtWidgets import *
from PyQt5 import uic
form_class = uic.loadUiType("checkboxTest.ui")[0]
class WindowClass(QMainWindow, form_class) :
def __init__(self) :
super().__init__()
self.setupUi(self)
#GroupBox밖에 있는 CheckBox에 기능 연결
self.chkBox1.stateChanged.connect(self.chkFunction)
self.chkBox2.stateChanged.connect(self.chkFunction)
#GroupBox안에 있는 CheckBox에 기능 연결
self.groupChkBox1.stateChanged.connect(self.groupchkFunction)
self.groupChkBox2.stateChanged.connect(self.groupchkFunction)
def chkFunction(self) :
#CheckBox는 여러개가 선택될 수 있기 때문에 elif를 사용하지 않습니다.
if self.chkBox1.isChecked() : print("checkBox 1 is Checked")
if self.chkBox2.isChecked() : print("checkBox 2 is Checked")
def groupchkFunction(self) :
if self.groupChkBox1.isChecked() : print("group checkbox 1 is Checked")
if self.groupChkBox2.isChecked() : print("group checkbox 2 is Checked")
if __name__ == "__main__" :
app = QApplication(sys.argv)
myWindow = WindowClass()
myWindow.show()
app.exec_()
EX) 주문 시스템 만들기
- Window 디자인
- GroupBox, CheckBox
- GroupBox와 CheckBox의 텍스트(text) 속성 설정
- PushButton
- PushButton의 텍스트(text) 속성 설정
- Label의 텍스트 속성 설정
- GroupBox, CheckBox
- 객체 이름
- 옆의 그림을 보고 각 객체의 이름을 설정
- 동작
- 메뉴 선택 즉, 체크버튼을 클릭하면 총 금액에 반영되어 출력됨.
- 주문 버튼을 클릭하면 Terminal 창에 주문 내역을 출력
PyQt 시그널/슬롯
- 위젯에 정의된 이벤트를 시그널(signal)이라고 부름
- 특정 이벤트(signal)이 발생했을 때 호출되는 함수(메서드)를 슬롯(slot)라고 부름
- QPushButton의 객체 btn에 마우스 클릭이 되었을 때 btn_clicked()라는 슬롯(메서드, 함수)이 호출되게 설정하는 코드
- btn.clicked.connect( self.btn_clicked( ) )
- 버튼에 마우스 좌 클릭에 대한 이벤트가 아니라 우 클릭에 대한 이벤트에 대한 특정 슬롯을 정의 하려고 할 때 우 클릭인지 좌 클릭인지 알 수 없음.
- QPushButton 객체에 마우스 클릭 이벤트가 발생했을 때 좌우 클릭을 구분하지 않고 ‘클릭'되었을 때 특정 슬롯을 연결할 수 있음 뿐임
- QPushButton의 객체 btn에 마우스 클릭이 되었을 때 btn_clicked()라는 슬롯(메서드, 함수)이 호출되게 설정하는 코드
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class MySignal(QObject):
signalx = pyqtSignal()
def run(self):
self.signalx.emit()
class MyWindow(QMainWindow):
def __init__(self):
super().__init__()
mysignal = MySignal()
mysignal.signalx.connect(self.signalx_emitted)
mysignal.run()
@pyqtSlot()
def signalx_emitted(self):
print('signalx emitted')
app = QApplication(sys.argv)
mywindow = MyWindow()
mywindow.show()
app.exec_()
- 코드 분석 – class MySignal(QObject)
- pyqtSignal( ) pyqtSignal 객체(signalx) 생성
- QPushButton에서 ‘clicked’라는 시그날이 있듯 MySignal에 ‘signalx’라는 시그날을 사용자가 생성함
- pyqtSignal 클래서에 정의된 emit() 메서드는 ‘signalx’을 발생시킴
- pyqtSignal( ) pyqtSignal 객체(signalx) 생성
- 코드 분석 – class MyWindow(QMainWindows)
- mysignal = MySignal( )
- MySignal 클래스의 객체(mysignal)을 생성함
- mysignal.signalx.connect( self.signalx.emitted )
- 시그날 ‘signalx’를 슬롯, signalx_emitted에 연결
- mysignal.run( )
- self.signalx.emit( )가 호출됨 ‘signalx’ 발생시킴
- mysignal = MySignal( )
PyQt 사용자 정의 시그널/슬롯 – 시그널로 데이터 보내기
- 한 객체에서 다른 객체로 데이터 보내기 – 사용자 정의 시그널로 다른 객체로 데이터 보내기
- 코드 분석
- pyqtSignal( ) pyqtSignal 객체(signaly) 생성
- pyqtSignal 클래스에 정의된 emit() 메서드는 ‘signaly’을 발생시킴
- emit(1,2)는 정수 1과 2를 전달
- mysignal.signaly.connect( self.signaly.emitted )
- 시그날 ‘signaly’를 슬롯, signaly_emitted에 연결
- mysignal.run( )
- self.signaly.emit(1, 2)가 호출됨 ‘signaly’ 발생시킴
- 시그날, ‘signaly’에 대한 슬롯, signaly_emitted(self, arg1, arg2) 실행
- pyqtSignal( ) pyqtSignal 객체(signaly) 생성
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *class MySignal(QObject):
signalx = pyqtSignal()
signaly = pyqtSignal(int, int)
def run(self):
self.signalx.emit()
self.signaly.emit(1, 2)
class MyWindow(QMainWindow):
def __init__(self):
super().__init__()
mysignal = MySignal()
mysignal.signalx.connect(self.signalx_emitted)
mysignal.signaly.connect(self.signaly_emitted)
mysignal.run()
@pyqtSlot()
def signalx_emitted(self):
print('signalx emitted')
@pyqtSlot(int, int)
def signaly_emitted(self, arg1, arg2):
print('signaly emiitted', arg1, arg2)
'빅데이터 분석가 양성과정 > PyQt' 카테고리의 다른 글
PyQT를 활용한 회사/차량 데이터 인터페이스 제작 - mpg.csv (0) | 2024.07.10 |
---|---|
시그널과 함수 (0) | 2024.07.10 |
시작 (0) | 2024.07.10 |