[임베디드 GUI] Class Form & 메모장 구현

정재훈·2022년 4월 26일
0

임베디드 GUI

목록 보기
4/7

Class Form

QWidget 의 메서드를 재정의하여 사용 -> 기존 메서드 교체 가능
QWidget 의 이벤트 함수를 사용 가능 -> 이벤트 발생시 호출되는 함수 재정의
class 내부에서 전역으로 변수를 사용을 위해 항상 self 를 붙여준다
만약 self 안붙이면 메서드 내에서만 쓸수있는 지역변수

from PySide6.QtWidgets import *

class MyApp(QWidget):
    def __init__(self):
        super().__init__()
        self.main()


    def main(self):
        self.resize(400,400)
        self.btn = QPushButton("HI",self)
        self.btn.clicked.connect(self.go)

    def go(self):
        self.msg = QMessageBox()
        self.msg.setText("Hello")
        self.msg.exec()

    def closeEvent(self,event): # 위젯 종료시 호출되는 함수로 함수명은 변경하면 안된다.
        self.msg = QMessageBox()
        self.msg.setText("BYE")
        self.msg.exec()

app = QApplication()
win = MyApp() # QWidgets이 아닌 class로 지정해줌
win.show()
app.exec()

응용

from PySide6.QtWidgets import *

class MyApp(QWidget):
    def __init__(self):
        super().__init__()
        self.main()


    def main(self):
        lay = QVBoxLayout()
        self.btn1 = QPushButton("1")
        self.btn2 = QPushButton("2")
        self.btn3 = QPushButton("3")
        lay.addWidget(self.btn1)
        lay.addWidget(self.btn2)
        lay.addWidget(self.btn3)
        self.setLayout(lay)
        self.btn1.clicked.connect(self.one)
        self.btn2.clicked.connect(self.two)
        self.btn3.clicked.connect(self.three)

    def showMsg(self,str):
        self.msg = QMessageBox()
        self.msg.setText(str)
        self.msg.exec()

    def closeEvent(self,event): # 위젯 종료시 호출되는 함수로 함수명은 변경하면 안된다.
        self.showMsg("BYE")
    def one(self):
        self.showMsg("1")
    def two(self):
        self.showMsg("2")
    def three(self):
        self.showMsg("3")

app = QApplication()
win = MyApp() # QWidgets이 아닌 class로 지정해줌
win.show()
app.exec()

메모장 구현하기

from PySide6.QtWidgets import *
from PySide6.QtGui import *

app = QApplication()
app.setApplicationName("메모장")
edit = QPlainTextEdit() # 메모장 생성

class MainWindow(QMainWindow):
    def closeEvent(self, event):
        if not edit.document().isModified():
            return
        answer = QMessageBox.question(window, None, "Save or Not",
                                      QMessageBox.Save |
                                      QMessageBox.Discard |
                                      QMessageBox.Cancel)
        if answer & QMessageBox.Save:
            save()
        elif answer & QMessageBox.Cancel:
            event.ignore()

window = MainWindow()
window.setCentralWidget(edit)
menu = window.menuBar().addMenu("&File") # $File = $는 맨 앞자를 따와 Alt + F를 단축키로 사용

open_action = QAction("&Open")
def open_file():
    path = QFileDialog.getOpenFileName(window, "Open File")[0]
    if path:
        edit.setPlainText(open(path).read())
open_action.triggered.connect(open_file)
open_action.setShortcut(QKeySequence("Ctrl+O"))  # 단축키 설정
menu.addAction(open_action)

file_path = None
save_action = QAction("&Save")
def save():
    if file_path is None:
        save_as()
    else:
        with open(file_path, "w") as f:
            f.write(edit.toPlainText())
            edit.document().setModified(False)

save_action.triggered.connect(save)
save_action.setShortcut(QKeySequence("Ctrl+S"))
menu.addAction(save_action)

save_as_action = QAction("Save &As...")
def save_as():
    global file_path
    path = QFileDialog.getSaveFileName(window, "Save As")[0]
    if path:
        file_path = path
        save()

save_as_action.triggered.connect(save_as)
menu.addAction(save_as_action)



close = QAction("&Close")
close.triggered.connect(window.close)
menu.addAction(close)

help_menu = window.menuBar().addMenu("&Help")
about_action = QAction("&About")
help_menu.addAction(about_action)

def show_about_dialog():
    text = "<center>" \
            "<h1>Text Editor</h1>" \
            "<\center>" \
            "<p>Version 1.2.3.<br>"\
            "Copyright MCD</p>"

    QMessageBox.about(window, "About", text)

about_action.triggered.connect(show_about_dialog)


window.show()
edit.show()
app.exec()
profile
여러 방향으로 접근하는 개발자

0개의 댓글