본문 바로가기
Python Library/PySide

[PySide] 인터페이스 변경

by goatlab 2022. 6. 13.
728x90
반응형
SMALL

인터페이스 변경

 

버튼을 수정하고 텍스트를 변경하고 버튼을 비활성화하여 더 이상 클릭할 수 없도록 슬롯 메서드를 업데이트할 수 있다. 또한, 체크 가능 상태를 끌 것이다.

 

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("My App")

        self.button = QPushButton("Press Me!")
        self.button.clicked.connect(self.the_button_was_clicked)

        self.setCentralWidget(self.button)

    def the_button_was_clicked(self):
        self.button.setText("You already clicked me.")
        self.button.setEnabled(False)

        # Also change the window title.
        self.setWindowTitle("My Oneshot App")

 

button 메서드에서 액세스할 수 있어야 하기 때문에 the_button_was_clicked에 대한 참조를 유지한다. 버튼의 텍스트는 str에 전달하여 setText()로 변경된다. 버튼 호출을 비활성화하려면 setEnabled()을 False로 한다.

 

신호를 트리거하는 버튼을 변경하는 것으로 제한되지 않으며 슬롯 방식에서 원하는 모든 작업을 수행할 수 있다. 예를 들어, the_button_was_clicked 창 제목을 변경하려면 메서드에 추가하면 된다.

 

self.setWindowTitle("A new window title")

 

대부분의 위젯에는 자체 신호가 있으며 QMainWindow 창에 사용하는 것도 예외는 아니다. windowTitleChanged 신호를 QMainWindow사용자 지정 슬롯 방법에 연결한다.

 

다음 예에서 windowTitleChanged 신호를 QMainWindow 메소드 슬롯 the_window_title_changed에 연결한다. 이 슬롯은 새 창 제목도 받는다.

 

from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton

import sys
from random import choice

window_titles = [
    'My App',
    'My App',
    'Still My App',
    'Still My App',
    'What on earth',
    'What on earth',
    'This is surprising',
    'This is surprising',
    'Something went wrong'
]


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.n_times_clicked = 0

        self.setWindowTitle("My App")

        self.button = QPushButton("Press Me!")
        self.button.clicked.connect(self.the_button_was_clicked)

        self.windowTitleChanged.connect(self.the_window_title_changed)

        self.setCentralWidget(self.button)

    def the_button_was_clicked(self):
        print("Clicked.")
        new_window_title = choice(window_titles)
        print("Setting title:  %s" % new_window_title)
        self.setWindowTitle(new_window_title)

    def the_window_title_changed(self, window_title):
        print("Window title changed: %s" % window_title)

        if window_title == 'Something went wrong':
            self.button.setDisabled(True)


app = QApplication(sys.argv)

window = MainWindow()
window.show()

app.exec_()

 

먼저, 창 제목 목록을 파이썬의 내장 random.choice()에서 설정한다. 커스텀 슬롯 메소드 the_window_title_changed를 윈도우 .windowTitleChanged 시그널에 연결한다.

 

버튼을 클릭하면 창 제목이 임의로 변경된다. 새 창 제목이 "Something went wrong"과 같으면 버튼이 비활성화된다.

 

몇 가지 주의할 점이 있다.

 

첫째, 창 제목을 설정할 때 windowTitleChanged 신호가 항상 발생되는 것은 아니다. 새 제목이 이전 제목에서 변경된 경우에만 신호가 발생한다 . 동일한 제목을 여러 번 설정하면 신호는 처음에만 발생한다. 앱에서 신호를 사용할 때 놀라지 않도록 신호가 발생하는 조건을 다시 확인하는 것이 중요하다.

둘째, 신호를 사용하여 사물 을 연결 하는 방법에 주목해야 한다. 버튼을 누르면 다른 여러 일이 차례로 발생할 수 있다. 이러한 후속 효과는 원인을 알 필요가 없으며 단순한 규칙의 결과에 따를 것이다. 트리거에서 효과를 분리 하는 것은 GUI 애플리케이션을 구축할 때 이해해야 하는 핵심 개념 중 하나이다.

 

728x90
반응형
LIST

'Python Library > PySide' 카테고리의 다른 글

[PySide] 이벤트  (0) 2022.06.13
[PySide] 위젯 연결하기  (0) 2022.06.13
[PySide] 신호 및 슬롯  (0) 2022.05.23
[PySide] 창 및 위젯 크기 조정  (0) 2022.05.23
PySide  (0) 2022.05.23