PyQt5 여러 화면 전환 구현하기

김유상·2022년 11월 21일
0

ICT인턴십

목록 보기
11/21

PyQt5에서 여러 화면 전환 구현시도(실패)

화면 구현에 앞서 QMainWindow의 setCentralWidget()을 이용해 여러 화면을 번갈아 가면서 표시할 수 있는지 확인하였다. 일단 화면을 전환하는 것은 가능했다.

def mousePressEvent(self, e):
    if self.takeCentralWidget() == self.result_groupbox:
        if e.button() == QtCore.Qt.LeftButton:
            self.setCentralWidget(self.veri_groupbox)

마우스로 한번의 클릭이 발생하면 화면(groupbox = QWidget)을 전환하는 Python 코드이다. 하지만 이런 방식으로 전환하게 되면 QMainWindow가 사용하지 않은 QWidget을 자동으로 찾아서 제거하는 상황에 빠진다...

그래서 다른 QWidget으로 전환한 시점에 이전 QWidget은 지워져 있을 가능성이 높다.
다음과 같은 오류가 발생했고 다른 방법을 찾아야 할 것 같다...
RuntimeError: wrapped C/C++ object of type VerificationGroupBox has been deleted

Referenced: https://stackoverflow.com/questions/5339062/python-pyside-internal-c-object-already-deleted


PyQt5 QStackedWidget을 이용해 여러 화면 전환 구현하기

APIs

addWidget(QWidget) : QWidget형태의 페이지를 QStackedWidget 객체에 추가합니다.
setCurrentIndex(int) / setCurrentWidget(QWidget) : 인덱스값이나 위젯명을 통해 페이지를 전환합니다.
insertWidget(int, QWidget) : QWidget형태의 페이지를 원하는 인덱스값 위치에 삽입합니다.
indexOf(QWidget) : 페이지의 인덱스값을 반환합니다.
widget(int) : 해당 인덱스 값을 갖는 페이지를 반환합니다.
count() : 전체 페이지의 수를 반환합니다.
currentIndex() : 현재 페이지의 인덱스를 반환합니다.
currentWidget() : 현재 페이지를 반환합니다.
removeWidget(QWidget) : 해당 페이지를 삭제합니다.
currentChanged() : 페이지 변경 시 시그널을 발생합니다.
widgetRemoved : 페이지 삭제시 시그널을 발생합니다.

self.result_groupbox = ResultGroupBox()
self.veri_groupbox = VerificationGroupBox()

self.stacked_widget = QStackedWidget()
self.stacked_widget.addWidget(self.veri_groupbox)
self.stacked_widget.addWidget(self.result_groupbox)

self.setCentralWidget(self.stacked_widget)

이렇게 GroupBox와 같은 QWidget들을 QStackedWidget에 추가해주면 QMainWindow에서 setCentralWidget()을 통해 간편하게 보여줄 수 있다. 스택에 제일 먼저 삽입된 QWidget은 가장 낮은 인덱스인 0을 가지게 되며 set 설정을 따로 해주지 않으면 기본적으로 인덱스가 0인 페이지를 보여준다.

Referenced: https://wikidocs.net/162838

profile
continuous programming

0개의 댓글