pyqt6 의 간단한 활용법을 설명드리겠습니다.(visual studio 2019 에서 사용하였습니다.)
pyqt6에서 지원하는 designer tools을 사용하였고 이제 시작합니다!
설치방법 - 아래 모듈을 설치합니다.
pyqt6 설치 : pip install pyqt6
qt desinger 설치 : pip install pyqt6-tools
1. pyqt6-tools designer 실행
1.1 아래와 같이 PowerShell에 "pyqt6-tools designer" 라고 입력 후 엔터
1.2 실행 후 화면은 아래와 같이 나옵니다.
1.3 Main Window 를 클릭 후 "생성" 버튼 클릭!
1.4 아래와 같은 MainWindow 가 나오게 됩니다. 아무 것도 없죠?
1.5 아래와 같이 만들어 봅시다. (목표에 맞춰서 대충 만드셔도 됩니다. 설명해드리려고 label을 넣었어요)
목표 : 맨 위에 텍스트 입력 > 버튼 클릭 > 위에서 입력된 텍스트 아래에 출력
좌측 위젯 상자에서 drag&drop을 하여 우측에 넣을 수 있습니다.
사용된 위젯은 4개 입니다.
- Display Widgets > Label
- Display Widgets > Text Browser
- Input Widgets > Text Edit
- Buttons > Push Button
MainWindow, push button 등 크기는 마우스로 직접 수정도 가능하고 각 위젯을 클릭했을 때 우측에 QWidget 항목 중 geometry를 이용하면 원하는 위치 및 크기를 설정할 수 있습니다.(아래 스크린샷)
1.6 저장
파일>저장 or 다른 이름으로 저장 을 하여 본인의 workspace경로에 해당 파일을 저장합니다.
저는 pyqt6_excercise.ui 파일로 저장하였습니다.
1.7 QT Designer에서 만든 .ui 파일에서 .py 파일로의 변환!
개발자 명령 프롬프트에 아래 명령어를 넣으면 됩니다. 1.6에서 생성한 .ui파일을 아래 경로에다가 넣어줘야 합니다!
생성 규칙 : pyuic6 -x .\<내가 생성한 ui파일이름.ui> -o <생성 할 py파일이름.py>
예제 : pyuic6 -x .\pyqt6_excercise.ui -o pyqt6_excercise.py
아래와 같이 입력하고 enter! 그러면 동일 폴더 내에 아래와 같이 .py파일이 생성된 것을 확인할 수 있습니다.
2. 생성된 pyqt6_excercise.py 파일 분석하기
아래는 자동생성된 pyqt6_excercise.py 파일 전체 코드입니다.
음.. 엄청 복잡해보이죠? 사실 복잡하지 않습니다. 그냥 우리가 QT Designer에서 만든 것들을 코딩해준 거에요! 아래 내용을 직접 코딩해서 쓸 수도 있습니다. 다만 좌표값, 각종 크기등을 직접 설정하는 것이 번거롭기 때문에 도와주는 것이죠.
코드를 설명드리면
라인12 : Ui_MainWindow라는 class를 정의하고
라인13 : setupUi 매써드(내가 만든 블럭들의 위치, 크기를 셋팅해준 곳 입니다.)
라인48 : retranslateUi 매써드(유저가 pyqt6에서 직접 적은 내용을 하나의 메써드에 몰아놨네요)
라인57 : main함수(main함수 내용은 아래 글을 읽으시면 됩니다.)
python main함수 만들기(if __name=="__main__": ) (tistory.com)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
# Form implementation generated from reading ui file '.\pyqt6_excercise.ui'
#
# Created by: PyQt6 UI code generator 6.4.2
#
# WARNING: Any manual changes made to this file will be lost when pyuic6 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt6 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(591, 325)
self.centralwidget = QtWidgets.QWidget(parent=MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.pushButton = QtWidgets.QPushButton(parent=self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(40, 120, 75, 24))
self.pushButton.setObjectName("pushButton")
self.textEdit = QtWidgets.QTextEdit(parent=self.centralwidget)
self.textEdit.setGeometry(QtCore.QRect(40, 40, 241, 51))
self.textEdit.setObjectName("textEdit")
self.textBrowser = QtWidgets.QTextBrowser(parent=self.centralwidget)
self.textBrowser.setGeometry(QtCore.QRect(40, 190, 241, 51))
self.textBrowser.setObjectName("textBrowser")
self.label = QtWidgets.QLabel(parent=self.centralwidget)
self.label.setGeometry(QtCore.QRect(40, 20, 451, 16))
self.label.setObjectName("label")
self.label_2 = QtWidgets.QLabel(parent=self.centralwidget)
self.label_2.setGeometry(QtCore.QRect(40, 170, 461, 16))
self.label_2.setObjectName("label_2")
self.label_3 = QtWidgets.QLabel(parent=self.centralwidget)
self.label_3.setGeometry(QtCore.QRect(40, 100, 301, 16))
self.label_3.setObjectName("label_3")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(parent=MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 591, 22))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(parent=MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton.setText(_translate("MainWindow", "PushButton"))
self.label.setText(_translate("MainWindow", "TextLabel - 아래 텍스트를 입력하세요. 아래는 Input Widgets의 Text Edit 입니다."))
self.label_2.setText(_translate("MainWindow", "TextLabel - 위의 텍스트가 아래 입력됩니다. Display Widgets의 Text Browser 입니다."))
self.label_3.setText(_translate("MainWindow", "TextLabel - 텍스트를 입력하고 아래 버튼을 누르세요"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec())
|
cs |
사실 위의 코드를 하나씩 설명을 할 수 있습니다만 잘 보면 다 비슷하다는 것을 알 수 있습니다. 그 중에 하나만 설명드려도 나머지는 이해가 되실거에요.
아래 pushButton코드설명을 드리면
라인1 : QtWidgets이라는 모듈 안에 QPushButton class의 instance를 Ui_MainWindow class내 인스턴스 변수에 넣습니다.
라인2 : 그러면 self.pushButton instance 클래스내 setGeometry 메써드를 호출 할 것인데 argument에는 QtCore모듈의 QRect class의 parameter를 확인해보니 aleft, atop, awidth, aheight 인 것으로보니
aleft는 왼쪽으로부터 40, atop은 위로부터 120, awidth는 너비 75, aheight는 높이 24 라고 볼 수 있겠네요!
라인 3 : 해당 버튼의 이름을 변경!
1
2
3
|
self.pushButton = QtWidgets.QPushButton(parent=self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(40, 120, 75, 24))
self.pushButton.setObjectName("pushButton")
|
cs |
자 이제 나머지도 다 비슷하게 생겼으니 설명은 이만하고 실제 구현을 해볼까요?
1
2
3
4
5
6
7
8
9
10
|
def click_button(self):
self.pushButton.clicked.connect(self.get_texteditdata)
self.pushButton.clicked.connect(self.set_textbrowser)
def get_texteditdata(self):
self.text_value = self.textEdit.toPlainText()
def set_textbrowser(self):
self.textBrowser.setPlainText(self.text_value)
|
cs |
위의 3가지 매써드만 있으면 구현이 가능합니다!! 간단하죠?
위의 메써드는 class Ui_MainWindow(object) class내 함수입니다.
click button 매써드에서 버튼이 클릭 되었을 때 함수를 실행하는 식으로 진행을 합니다.
1) def click_button(self):
self.pushButton.clicked.connect(self.get_texteditdata) 는 버튼이 클릭되었을때 연결해라 parameter안에 있는 self.get_texteditdata함수를 호출해라
self.pushButton.clicked.connect(self.set_textbrowser) 는 버튼이 클릭되었을때 연결해라 parameter안에 있는 self.set_textbrowser함수를 호출해라
2) def get_texteditdata(self):
self.text_value = self.textEdit.toPlainText() 는 TextEdit에 쓰여있는 글자를 가져와서 self.text_value 인스턴스변수에 값을 넣습니다.
3) def set_textbrowser(self):
self.textBrowser.setPlainText(self.text_value) 는 textBrowser에 text를 Plaintext형식의 글을 넣을 것인데 2)에서 self.text_value 인스턴스변수에 저장된 문자열 값을 넣습니다.
toPlainText() | TextEdit에 쓰여있는 글자를 가져옵니다. |
.setPlainText(String) | TextEdit에 PlainText 형식의 글을 새로 입력합니다. Parameter에는 TextEdit에 표시할 글자가 들어갑니다. |
.setText(String) | TextEdit에 RichText 형식의 글을 입력합니다. Parameter에는 TextEdit에 표시할 글자가 들어갑니다. |
.append(String) | TextEdit에 글자를 추가합니다. 추가된 글자는 다음줄에 표시되며, Parameter에는 추가할 글자가 들어갑니다. |
.clear() | TextEdit에 쓰여있는 글자를 지웁니다. |
마지막으로 main함수에 ui.click_button() 클래스 함수를 불러오면 됩니다. 그리고 실행!
아래와 같이 실행이 됩니다!!
textlabel에 "Hello, World!!" 란 텍스트 값을 넣고 PushButton을 누르면 아래와 같이 잘 출력 되는 것을 볼 수 있습니다.
마지막으로 Pyqt6를 이용하여 아주 간단한 프로그램을 만들어 보았습니다.
다들 즐코딩 하세요!
댓글