지난번에는 로컬 데이터베이스를 설치하고 연결 세션을 만들어 데이터베이스에 등록된 화주 명단에 따라 테이블이

구성되도록 하였다.  이번에는 화주 추가 기능을 구현하여 실제로 데이터베이스에 화주를 등록하고 정상적으로

반영되는지 확인해본다.

 

1. 화주 추가 액션

        # 화주추가 액션 추가
        create_owner = QAction(QIcon('src/img/create_owner_icon.png'), '화주 추가', self)
        create_owner.setShortcut('Ctrl+Shift+A')
        create_owner.setStatusTip('화주 추가')
        create_owner.triggered.connect(self.create_owner)
        file_menu.addAction(create_owner)
        tool_bar.addAction(create_owner)
  • widgets/main_window.py 에서  MainWindow 위젯의 init_ui 메소드에 위와 같은 내용을 추가
  • create_owner 액션을 만들어 메뉴와 툴바에 추가하고 self.create_owner 메소드에 연결

 

 

2. 화주 추가 메소드

# 화주 추가
    def create_owner(self):
        # 다이얼로그 위젯 생성
        create_owner_dialog = Dialog()
        create_owner_dialog.setWindowTitle('화주 추가')
        create_owner_dialog.setGeometry(500, 500, 300, 50)

        # 화주 이름을 입력받기 위한 다이얼로그 ui 세팅
        grid = QGridLayout()
        input_name = QPlainTextEdit()
        input_name.setPlaceholderText('화주 이름')
        submit = QPushButton('추가')
        submit.clicked.connect(create_owner_dialog.close)
        grid.addWidget(QLabel('화주 이름: '), 0, 0, 1, 1)
        grid.addWidget(input_name, 0, 1, 1, 2)
        grid.addWidget(submit, 1, 0, 1, 3)
        create_owner_dialog.setLayout(grid)

        # 다이얼로그를 modal 하게 표시
        create_owner_dialog.show_modal()

        # 다이얼로그에서 입력이 완료되면 입력받은 이름으로 화주 추가
        name = input_name.toPlainText()
        new_owner = DayCalOwner(name)
        try:
            session.add(new_owner)
            session.commit()
            self.central_widget.doc_tab.tab1.owner_added(name)
        except IntegrityError:
            self.statusBar().showMessage('>> 이미 등록된 화주입니다.')
  • widgets/main_window.py 에서  MainWindow 위젯에 create_owner 메소드를 위와 같이 정의

  • 추가할 화주의 이름을 입력받기 위한 다이얼로그를 생성하여 Modal 하게 표시한다.
    => Modal : 다이얼로그가 떠있는 동안 메인 프로세스와 상호작용할 수 없도록 하는 방식

  • 입력받은 이름을 key 값으로 하여 화주 모델인 DayCalOwner 클래스의 인스턴스를 생성

  • 데이터베이스 session에 인스턴스를 add, commit

  • central_widget의 doc_tab의 첫번째 탭인 DayCalWidget에서 화주가 추가됐을 때 이를 즉각 테이블에
    반영하기 위한 메소드인 owner_added를 실행

 

 

3. CentralWidget 

class CentralWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.doc_tab = DocTab()
        self.init_ui()

    def init_ui(self):
        self.setStyleSheet("background-color: #FFFFFF")

        # 그리드 레이아웃
        grid = QGridLayout()

        # 탭 위젯 추가
        grid.addWidget(self.doc_tab, 0, 0)

        # 중앙 위젯에 그리드 레이아웃 적용
        self.setLayout(grid)
  • DocTab 을 레이아웃을 통하지 않고 바로 참조하기 위해 CentralWidget을 QWidget을 상속하여 별도로 정의

 

 

4. Dialog

# 다이얼로그(QDialog 상속)
class Dialog(QDialog):
    def __init__(self):
        super().__init__()

    def show_modal(self):
        return super().exec_()
  • show_modal 기능을 갖춘 다이얼로그 위젯을 정의

 

 

5. 테이블에 추가된 화주 반영

    # 화주 추가 반영
    def owner_added(self, added_user):
        self.owners.append(added_user)
        self.input_table.insertColumn(self.input_table.columnCount())
        self.input_table.setHorizontalHeaderItem(self.input_table.columnCount()-1, QTableWidgetItem(added_user))
  • widgets/docs_window.py 에서 DayCal 위젯에 create_owner 메소드를 위와 같이 정의
  • 화주명 리스트에 추가된 화주이름을 추가하고 테이블에 열을 하나 추가하여 추가된 화주의 이름을 헤더로 설정

 

 

 

 

정상적으로 화주가 추가되는 것을 확인할 수 있다.

 

※ 간단하게 구현을 해봤지만 화주 이름을 추가할 때 추가 버튼을 엔터키로 대체할 수 없는 부분이나 
   아무것도 버튼을 누르지 않고 창을 닫기만 해도 입력된 것으로 처리되는 등의 문제가 있어 수정이 필요한 상태이다.

=> 현재는 수정되었다.

 

+ Recent posts