1. ๋ชฉํ‘œ

๋”๋ณด๊ธฐ
  • File ๋ฉ”๋‰ด์˜ Close ํ•ญ๋ชฉ๊ณผ ๋‹จ์ถ•ํ‚ค Ctrl+Q ๋ฅผ ๋ˆŒ๋ €์„ ๋•Œ ํ”„๋กœ๊ทธ๋žจ์ด ์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๋˜๋„๋ก ๊ตฌํ˜„ํ•œ๋‹ค
  • ๋ฉ”์ธ ์œˆ๋„์šฐ๋ฅผ ๋‹ซ์œผ๋ฉด Qt ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ ์ข…๋ฃŒ๋˜๊ณ , ํŒŒ์ด์ฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋๋‚˜๋Š” ํ๋ฆ„์„ ์ดํ•ดํ•œ๋‹ค
  • Qt Designer ์—์„œ ๋งŒ๋“  QAction ๊ณผ ํŒŒ์ด์ฌ ์Šฌ๋กฏ ๋ฉ”์„œ๋“œ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ํŒจํ„ด์„ ๋ณต์Šตํ•œ๋‹ค
  • ์ดํ›„ ๋‹จ๊ณ„์—์„œ ์ข…๋ฃŒ ์ „์— ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ์ €์žฅํ•˜๋Š” ๊ธฐ๋Šฅ์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ฐ˜์„ ๋งŒ๋“ ๋‹ค

 

2. ์ „์ฒด ๋กœ์ง

๋”๋ณด๊ธฐ
# mainwindow.py

. . .

class MainWindow(QMainWindow):
    def __init__(self, parent=None):

        . . .
        
       self.ui.actionClose.triggered.connect(self.exit_app)
 
        . . .

    def exit_app(self):
        self.close()
# main.py

import sys
from PySide6.QtWidgets import QApplication

from mainwindow import MainWindow

if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec())

 


 

3. ํ•„์š”ํ•œ import + ์ฃผ์„ ์„ค๋ช…

๋”๋ณด๊ธฐ

๋™์ผ



4. ๋ฉ”๋‰ด ์•ก์…˜๊ณผ ์Šฌ๋กฏ ์—ฐ๊ฒฐํ•˜๊ธฐ (actionClose↔ exit_app)

๋”๋ณด๊ธฐ
class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        # QTextEdit ๋ณ„์นญ ๋“ฑ ๋‹ค๋ฅธ ์ดˆ๊ธฐํ™” ์ฝ”๋“œ๊ฐ€ ๋จผ์ € ์˜จ๋‹ค
        self.editor = self.ui.textEdit

        # 9.9 ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ ๊ธฐ๋Šฅ
        # File ๋ฉ”๋‰ด์˜ Close ํ•ญ๋ชฉ๊ณผ ํˆด๋ฐ” ์•„์ด์ฝ˜, ๋‹จ์ถ•ํ‚ค Ctrl+Q ๋Š”
        # ๋ชจ๋‘ actionClose ์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค
        # ์—ฌ๊ธฐ์„œ ๊ทธ ์‹œ๊ทธ๋„์„ MainWindow.exit_app ์Šฌ๋กฏ์— ์—ฐ๊ฒฐํ•œ๋‹ค
        self.ui.actionClose.triggered.connect(self.exit_app)

 

  • QAction ์ด๋ฆ„ actionClose
  • File ๋ฉ”๋‰ด์— ์ถ”๊ฐ€๋˜์–ด ์žˆ๊ณ 
  • ๋‹จ์ถ•ํ‚ค๋Š” Ctrl+Q ๋กœ ์„ค์ •๋˜์–ด ์žˆ๋‹ค
์ด ํ•œ ์ค„๋กœ ๋ฉ”๋‰ด ํด๋ฆญ, ํˆด๋ฐ” ํด๋ฆญ, ๋‹จ์ถ•ํ‚ค ์ž…๋ ฅ ๋ชจ๋‘๊ฐ€ exit_app ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋œ๋‹ค.

 


 

5. ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ํ•จ์ˆ˜

๋”๋ณด๊ธฐ
    def exit_app(self):
        # ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ•˜๋Š” ์Šฌ๋กฏ ๋ฉ”์„œ๋“œ์ด๋‹ค
        # ์ด ๋ฉ”์„œ๋“œ๋Š” File ๋ฉ”๋‰ด์˜ Close ์•ก์…˜์ด ๋ˆŒ๋ ธ์„ ๋•Œ ํ˜ธ์ถœ๋œ๋‹ค

        # ํ•™์Šต์šฉ์œผ๋กœ ์ฝ˜์†”์— ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธด๋‹ค
        # ์‹ค์ œ ๋ฐฐํฌ์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” ์ƒ๋žต ๊ฐ€๋Šฅํ•˜๋‹ค
        print("ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค")

        # QMainWindow.close ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด
        # ๋ฉ”์ธ ์œˆ๋„์šฐ๊ฐ€ ๋‹ซํžˆ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋กœ QApplication ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ ๋๋‚œ๋‹ค
        # main.py ์—์„œ sys.exit(app.exec()) ๋กœ ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์œผ๋ฏ€๋กœ
        # ์—ฌ๊ธฐ์„œ close ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด app.exec() ์ด ๋ฐ˜ํ™˜๋˜๊ณ  ํ”„๋กœ๊ทธ๋žจ์ด ์™„์ „ํžˆ ์ข…๋ฃŒ๋œ๋‹ค
        self.close()

์ข€ ๋” ๋ฐœ์ „์‹œํ‚ค๊ณ  ์‹ถ๋‹ค๋ฉด

  • ์ข…๋ฃŒ ์ „์— maybe_save ๋ฅผ ํ˜ธ์ถœํ•ด ์ˆ˜์ •๋œ ๋‚ด์šฉ์„ ์ €์žฅํ• ์ง€ ๋ฌผ์–ด๋ณธ๋‹ค
  • ์‚ฌ์šฉ์ž๊ฐ€ ์ทจ์†Œ๋ฅผ ์„ ํƒํ•˜๋ฉด ์ข…๋ฃŒ๋ฅผ ๋ง‰๋Š”๋‹ค

 

6. ์‹คํ–‰ ํ…Œ์ŠคํŠธ

 

7. ํ•™์Šต ์ฃผ์š” ํฌ์ธํŠธ

๋”๋ณด๊ธฐ

 

Qt ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ข…๋ฃŒ ํ๋ฆ„ ์ดํ•ด

  • main.py ์—์„œ QApplication ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค๊ณ  app.exec ์œผ๋กœ ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค
  • ๋ฉ”์ธ ์œˆ๋„์šฐ๊ฐ€ ๋‹ซํžˆ๋ฉด ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ ์ข…๋ฃŒ๋˜๊ณ  app.exec ์ด ๋ฐ˜ํ™˜๋œ๋‹ค
  • ๊ทธ ๋ฐ˜ํ™˜๊ฐ’์„ sys.exit ๋กœ ๋„˜๊ฒจ ์ฃผ๋ฉด ์šด์˜์ฒด์ œ์— ์ข…๋ฃŒ ์ฝ”๋“œ๋ฅผ ์ „๋‹ฌํ•˜๋ฉด์„œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋๋‚œ๋‹ค

 

QAction ๊ณผ ์Šฌ๋กฏ ์—ฐ๊ฒฐ ํŒจํ„ด ๋ณต์Šต

  • Qt Designer ์—์„œ ๋งŒ๋“  QAction(actionClose) ์„
    ํŒŒ์ด์ฌ ์ฝ”๋“œ์—์„œ self.ui.actionClose.triggered.connect(self.exit_app) ์œผ๋กœ ์—ฐ๊ฒฐํ•œ๋‹ค
  • ์ด ํŒจํ„ด์€ ์ €์žฅ, ์—ด๊ธฐ, ํ”„๋ฆฐํŠธ, PDF ๋‚ด๋ณด๋‚ด๊ธฐ, ํŽธ์ง‘ ๊ธฐ๋Šฅ ๋“ฑ
    ๋ชจ๋“  ๋ฉ”๋‰ด ๊ธฐ๋Šฅ์—์„œ ๋ฐ˜๋ณตํ•ด์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋ณธ ๊ตฌ์กฐ์ด๋‹ค

 

์ข…๋ฃŒ ๊ธฐ๋Šฅ์€ ๋‹จ์ˆœํ•˜์ง€๋งŒ ์ค‘์š”ํ•˜๋‹ค

  • ํŒŒ์ผ ์ €์žฅ, ์ธ์‡„ ๊ฐ™์€ ๊ธฐ๋Šฅ์€ ์ฝ”๋“œ๊ฐ€ ๊ธธ๊ณ  ๋ณต์žกํ•˜์ง€๋งŒ
    ์ข…๋ฃŒ ๊ธฐ๋Šฅ์€ self.close ํ•œ ์ค„์ด๋ฉด ๋™์ž‘ํ•œ๋‹ค
  • ํ•˜์ง€๋งŒ ํ”„๋กœ๊ทธ๋žจ ์ „์ฒด ์ƒ๋ช…์ฃผ๊ธฐ์˜ ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„์ด๋ฏ€๋กœ
    ๋‚˜์ค‘์— ๋ณ€๊ฒฝ ๋‚ด์šฉ ์ €์žฅ, ๋กœ๊ทธ ๋‚จ๊ธฐ๊ธฐ, ๋ฆฌ์†Œ์Šค ์ •๋ฆฌ ๋“ฑ
    ์ค‘์š”ํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ๋ชจ์ด๋Š” ์ง€์ ์ด๊ธฐ๋„ ํ•˜๋‹ค

 

์ด์ „ ๋‹จ๊ณ„์™€์˜ ์—ฐ๊ฒฐ ์˜์‹ํ•˜๊ธฐ

  • 9.3, 9.4, 9.5 ๋‹จ๊ณ„์—์„œ QFile, QTextStream ๊ธฐ๋ฐ˜ ํŒŒ์ผ ์ €์žฅ๊ณผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ๋ฅผ ๊ตฌํ˜„ํ–ˆ๋‹ค๋ฉด
    9.9 ๋‹จ๊ณ„์—์„œ ์ข…๋ฃŒ ์ „์— maybe_save ๋ฅผ ํ˜ธ์ถœํ•ด
    ์ˆ˜์ •๋œ ๋‚ด์šฉ์„ ์ €์žฅํ• ์ง€ ๋ฌผ์–ด๋ณด๋Š” ๊ตฌ์กฐ๋กœ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค
  • ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ ๊ธฐ๋Šฅ์ด
    ๋‹จ์ˆœํžˆ ์ฐฝ๋งŒ ๋‹ซ๋Š” ์—ญํ• ์ด ์•„๋‹ˆ๋ผ
    ๋ฐ์ดํ„ฐ ์†์‹ค์„ ๋ง‰๋Š” ์•ˆ์ „์žฅ์น˜ ์—ญํ• ๊นŒ์ง€ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค

 

PySide6 ๋ฌธ๋ฒ•๊ณผ ํŒŒ์ด์ฌ ๊ธฐ๋ณธ ๋ฌธ๋ฒ•์˜ ์—ญํ•  ๋ถ„๋ฆฌ

  • ์ข…๋ฃŒ ์ž์ฒด๋Š” ํŒŒ์ด์ฌ์˜ sys.exit ๋„ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ
    Qt ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ๋ณดํ†ต ์œ„์ ฏ์˜ close ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ข…๋ฃŒ๋ฅผ ์œ ๋„ํ•œ๋‹ค
  • ํŒŒ์ผ ์ €์žฅ, ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ๊ฐ™์€ ์ž‘์—…์€ ์ด ํ”„๋กœ์ ํŠธ์—์„œ๋Š”
    ํŒŒ์ด์ฌ open ๋Œ€์‹  Qt ์˜ QFile, QTextStream ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉํ–ฅ์„ ์ด๋ฏธ ์žก์•˜์œผ๋ฏ€๋กœ
    ์ข…๋ฃŒ ๋‹จ๊ณ„์—์„œ๋Š” ์ด ๊ธฐ๋Šฅ๋“ค์„ ์กฐํ•ฉํ•ด ์•ˆ์ „ํ•œ ์ข…๋ฃŒ ํ๋ฆ„์„ ์„ค๊ณ„ํ•œ๋‹ค๋Š” ๊ด€์ ์œผ๋กœ ์„ค๋ช…ํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค

 

 

๋‹จ๊ณ„๋ณ„ ์™„์„ฑ ํŒŒ์ผ