#버튼을 생성하기 위해서는 버튼 클래스를 추가적으로 불러와야합니다 # QPushBotton이라는 것을 추가하면 됩니다 classExam(QWidget): def__init__(self): super().__init__() self.initUI()
definitUI(self): #여기에 코드를 추가해줄 겁니다 btn = QPushButton('버튼에 들어가는 문자열',self)# self는 나 자신에게 버튼을 추가하겠다는 의미를 가집니다 btn.resize(btn.sizeHint())# sizeHint는 글씨를 기준으로 적당히 크기를 조절해주는 메소드라고 생각하면 됩니다 btn.move(20,30)#버튼 위치변경,왼쪽으로 부터,위쪽으로 부터 btn.setToolTip('툴팁입니다<b>이건 볼드한 부분입니다</b>')#마우스를 가져다 댔을때 설명이 나옵니다 #툴팁에는TAG가 들어갈수있습니다. <b>태그를 사용하면 미묘하게 굵어진 것을 확인할 수 있어요 self.setGeometry(300,300,400,500)#창크기를 조절하는 메소드 #왼쪽,위쪽으로부터의 위치,그리고 사이즈400 500을 의미합니다 self.setWindowTitle('Ex2학습시간')#타이틀 이름을 설정합니다 self.show()
app = QApplication(sys.argv) w = Exam() sys.exit(app.exec_())
#파이썬 코드 실행할 시에Atl + Shift + F10으로 하길 추천 #어느 파이썬파일을 실행할지 고를 수 있다. # Shift + F10으로 하면 편리하긴 하지만 선택할 수 없으며 이전에 실행할 파이썬 파일을 실행한다 #실행해보면 특정객체의 크기에 맞춰서 창 크기가 적용됨을 볼 수 있다
definitUI(self): btn = QPushButton("push me!",self) btn.resize(btn.sizeHint()) btn.move(50,50)#위치지정 #이벤트 처리는 시그널과 슬롯이라고 생각하면 됩니다 #버튼을 클릭하면'클릭했다는 시그널이 발생합니다' #그러면 클릭 시의 수행하는'슬롯'이라는게 있어요 #이벤트가 발생했을 때 수행되는 슬롯을 연결해주는게 이벤트 처리입니다 #이벤트 처리를 위한import후에 진행 btn.clicked.connect(QCoreApplication.instance().quit) #btn.clicked버튼을 클릭했을 때를 #connect연결해줍니다 #QcoreApplication.instance().quit QcoreApplication에 있는instance를 불러오고 #거기 안에 있는quit메소드를 호출해줍니다 #이렇게하면 객체가 나가지는 거니까=프로그램이 종료됩니다 #이 이벤트 처리를 작성하고나면 버튼을 누르고 나면 꺼질겁니다. #정리를 다시해보면QcoreApplication이 여러가지 이벤트를 하는 거고 #인스턴스를 생성하고 #메스드를 클릭이라는 걸 연결하는 겁니다 #위의 소스코드1줄이 이벤트 처리 학습의 핵심입니다 #다른 언어들보다 간단하게 나와있어요 #그 다음에 할 건 센터를 맞추는 겁니다 self.resize(400,500)#setGeometry(300,300,400,500)를 통해서 시작좌표 설정 및 크기설정도 가능 #resize만 쓰면 자동으로 전체 화면비율기준 중앙으로 세팅됩니다 #이것만으로도 유용합니다 self.setWindowTitle('Ex3') self.show()
#새로운 함수를 더 만듭니다 defcloseEvent(self,QCloseEvent):#좌측의 파란색 표시는Override되었기에 재정의를 해야한다는 의미입니다 #파란 표시를 클릭하면 정의된 부분으로 갈 수 있고(특별히 하는건 없지만 정의되어있음) #돌아올때에는Alt+<-화살표를 통해서 돌아올 수 있음(이클립스와 유사한 이동방식) #X버튼을 눌렀을 때 원래 실행되는 메소드 #원하는게X버튼을 눌렀을 때의 이벤트이므로 오버라이딩이 필요 print('실행테스트')#실제로 실행되는지 테스트하기 위해서 콘솔창 출력 확인 #QMessageBox.question(self,'종료확인','종료하시겠습니까?', # QMessageBox.Yes | QMessageBox.No,QMessageBox.Yes ) #self와 제목을 입력,메시지,그리고 버튼개수를 정해주기 #마지막 부분은 기본 값은 나타냅니다. X버튼 누르고 나타난 창에서 엔터치면 바로 실행될 버튼을 지칭하죠 #여기까지만 하면Yes든No든 종료된다 # QMessageBox는 내가 선택한 값을 전달해줄 수 있어요 ans = QMessageBox.question(self,'종료확인','종료하시겠습니까?', QMessageBox.Yes | QMessageBox.No,QMessageBox.Yes )#self와 제목을 입력,메시지,그리고 버튼개수를 정해주기 #ans값에 따라 종료할지 말지를 정할 수 있어요 #파라미터의QCloseEvent를 이용하는 겁니다 ifans == QMessageBox.Yes:#상수이기 때문에 비교할 수 있어요 QCloseEvent.accept() else: QCloseEvent.ignore()#이벤트 발생을 무시합니다 #만약에 조건없이QCloseEvnet.ignore()를 하면 프로그램은X버튼으로 끌 수 없게 됩니다 #위 코드기준에서라면'push me!'버튼을 클릭하는 것으로 대신 끌 수 있쬬 #버튼 클릭 시의QCoreApplication.instance().quit는QCloseEvent랑 별개거든요 #그래서 버튼 눌렀을 때에는 오버라이딩 된closeEvent메소드를 타지않게 되어 끌 수 있는 겁니다 app = QApplication(sys.argv) w = Exam()
importsys fromPyQt5.QtWidgetsimportQApplication,QMainWindow #기본적인 형태의 메뉴바를 만들어볼겁니다 #메뉴 및 상태표시줄을 하려면Qwidget으로는 안되요 #QMainWindow를import해줍니다 #한번 실행해보면,크게 다른점으 없을 수 있겠지만 상태표시줄 등을 추가할 수 있습니다 classExam(QMainWindow):#파라미터도QWidget에서QMainWindow로 변경해줍니다 def__init__(self): super().__init__() self.initUI()
definitUI(self): self.statusBar()#이거면 상태바가 추가됩니다 #한번 더 호출하면 상태표시줄 객체를 받아오게 됩니다 self.statusBar().showMessage('안녕하세요') #나타난 창의 최하단에'안녕하세요'가 나타났을 겁니다 #보통 어떤 상태입니다 혹은 어떤 메뉴입니다 설명을 할때에 사용하죠 #상태표시줄은 이게 끝입니다 self.resize(450,400) self.show()
importsys fromPyQt5.QtWidgetsimportQApplication,QMainWindow,QAction,QMenu #상태표시줄과 메뉴바는QWidget으로는 안됩니다 #QMainWindow를import합니다 #QAction은 아래에서'나가기'버튼을 만들기 위해import되었습니다 #QMenu는 서브그룹을 만들기 위해import되었습니다 #메뉴만 생성한 것을 넘어서 실제 눌렀을 때의 실행이 되거나 단축키로 실행되게 하려면 추가적은import필요 fromPyQt5.QtCoreimportQCoreApplication
menu =self.menuBar()#메뉴바가 생성됩니다.기본적으로는 아무것도 안보일겁니다 #여기에서[File]탭과 같은 그룹을 만들고 서브그룹을 만들면 가시적으로 보입니다 #우선 메뉴그룹을 만듭니다 menu_file = menu.addMenu('File')#저장을 해둬야 추후에 찾기 쉬우니 변수랑 맞춰줍니다 menu_edit= menu.addMenu('Edit') #현재로써는 아무것도 안되겠지만 메뉴가 생긴다는 걸 확인하세요 #위는 그룹을 만들었고 세부를 만들어보죠 #[File]탭에서'나가기'버튼을 만들어봅시다.그럴 경우QAction을import해야합니다다file_exit = menu_file. file_exit = QAction('나가기',self)#메뉴 객체 생성 file_exit.setShortcut('Ctrl+Q')#단축키를 설정하는게 가능합니다 self.statusBar()#아래의 상태표시줄을 사용하기 위해선1회 호출이 필요합니다 file_exit.setStatusTip('누르면 영원히 빠이빠이')#상태표시줄 내용을 추가하는 것도 가능합니다 #만들었으니 연결해야죠.현재로써는 메모리 어딘가에만 올라가 있을 뿐입니다 menu_file.addAction(file_exit) #위 부분을 하고나면[File]탭에 마우스를 올렸을때Exit가 나타납니다 #'나가기'라는 문자열이 왼쪽에서 살짝 떨어져있는건 아이콘이 들어갈 수 있는 여유공간을 나타냅니다 #다음은 서브그룹을 만들어볼겁니다 #서브그룹을 만들기 위해서는QMenu를import해야합니다 file_new = QMenu('New',self)#QAction과 동일한 구조이지만 서브그룹이니QMenu를 사용합니다 menu_file.addMenu(file_new) #순차상으로 위의file_exit보다 아래이기에 순서도Exit가 먼저나오고New가 나온것이다 #실제 프로그램을 만드는 경우라면New가 위에 있는게 더 가독성이 좋다 new_txt = QAction('텍스트 파일',self) new_py = QAction('파이썬 파일',self) file_new.addAction(new_txt)#파이썬 파일보다 먼저 적었으니,윗쪽에 위치할 거다 file_new.addAction(new_py)
#눌렀을 때의 기능에 대해서는 아직 안했으니 없는겁니다 #위 예제에서 주메뉴추가,서브메뉴추가,객체추가 에 대해서 각각 이해하고 #메뉴를 만들때에 순서에 대해서 잘 설계한 후에 코드를 작성해야합니다 self.resize(450,400) self.show()
#메뉴에 실제 기능 연결하기 #Extra , '나가기'버튼 클릭했을 때의 이벤트 처리 #눌러서도 꺼지고 단축키로도 꺼집니다 file_exit.triggered.connect(QCoreApplication.instance().quit)
#위의 코드로도 나름의 정렬은 되었지만 일반적인 코드 순서는 아래와 같다 #주메뉴 생성 #서브메뉴 혹은 객체 생성 #제일 아래에 주메뉴 추가 소스코드 #그 위에 서브메뉴 추가 소스코드 #구조가 바뀌변 복잡할 수 있으니까 제일 위에선 주메뉴 생성,제일 아래에선 주메뉴 추가까진 맞춰두고 #진행하시면 좋을 것 같네요 """ def initUI(self): self.statusBar() self.statusBar().showMessage('안녕하세요') menu = self.menuBar() #메뉴바 생성 menu_file = menu.addMenu('File') #그룹 생성 menu_edit = menu.addMenu('Edit') #그룹 생성 file_exit = QAction('Exit',self) #메뉴 객체 생성 file_exit.setShortCut('Ctrl+Q') file.setStatusTip('누르면 영원히 빠이빠이') new_txt = QAction('텍스트 파일',self) new_py = QAction('파이썬 파일',self) file_new = QMenu('New',self) file_new.addAction(new_txt) #서브메뉴 추가 file_new.addAction(new_py) #서브메뉴 추가 menu_file.addMenu(file_new) #주메뉴 추가(그룹) menu_file.addAction(file_exit) #주메뉴 추가(그룹) self.resize(450,400) self.show() """ #실제로 코드에 기능을 추가하기 위해서는 위 코드에서 아래 부분을 추가 #file_exit app = QApplication(sys.argv) w=Exam()