ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • PYSIDE6 시그널과 슬롯
    PYTHON(파이썬)/PYSIDE6(GUI) 2024. 10. 20. 08:43
    728x90
    반응형

     Qt 프레임워크에서 시그널과 슬롯 메커니즘은 객체 간 통신을 처리하는 데 사용됩니다. 시그널은 특정 이벤트가 발생했음을 알리는 역할을 하며, 슬롯은 이러한 이벤트에 반응하여 실행되는 함수입니다. 이 메커니즘을 통해 서로 관련이 없는 객체가 간단하고 효율적으로 상호작용할 수 있습니다.

     

    #### 시그널과 슬롯의 기본 사용

    PySide6에서 시그널과 슬롯을 사용하는 방법을 살펴보겠습니다. 다음은 QPushButton을 클릭할 때 "Hello, World!"를 출력하는 간단한 예제입니다.

     

    ```python

    import sys

    from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton

     

    class MainWindow(QMainWindow):

        def __init__(self):

            super().__init__()

            self.setWindowTitle("Signal and Slot Example")

            button = QPushButton("Click me")

            button.clicked.connect(self.button_clicked)

            self.setCentralWidget(button)

     

        def button_clicked(self):

            print("Hello, World!")

     

    app = QApplication(sys.argv)

    window = MainWindow()

    window.show()

    app.exec()

    ```

     

    이 예제에서 `button.clicked.connect(self.button_clicked)` 코드는 버튼의 `clicked` 시그널이 `button_clicked` 슬롯에 연결되도록 합니다. 버튼을 클릭하면 `button_clicked` 메서드가 호출되어 "Hello, World!"가 출력됩니다.

     

    #### 시그널 생성

    Qt는 다양한 기본 시그널을 제공하지만, 사용자 정의 시그널을 생성할 수도 있습니다. 사용자 정의 시그널을 생성하려면 `Signal` 클래스를 사용합니다. 아래는 사용자 정의 시그널을 생성하고 사용하는 예제입니다.

     

    ```python

    from PySide6.QtCore import Signal, QObject

     

    class Communicate(QObject):

        speak = Signal()

     

    class MainWindow(QMainWindow):

        def __init__(self):

            super().__init__()

            self.setWindowTitle("Custom Signal Example")

            self.comm = Communicate()

            self.comm.speak.connect(self.say_hello)

            self.comm.speak.emit()

     

        def say_hello(self):

            print("Hello from custom signal!")

     

    app = QApplication(sys.argv)

    window = MainWindow()

    window.show()

    app.exec()

    ```

     

    여기서 `Communicate` 클래스는 `speak`라는 사용자 정의 시그널을 정의합니다. `speak` 시그널은 `MainWindow` 클래스의 `say_hello` 슬롯에 연결되고, `emit` 메서드를 호출하여 시그널을 방출합니다.

     

    #### 슬롯 생성

    슬롯은 일반적인 Python 함수이지만, `@Slot` 데코레이터를 사용하여 슬롯임을 명확히 할 수 있습니다. 이는 특히 다중 스레딩 환경에서 유용합니다.

     

    ```python

    from PySide6.QtCore import Slot

     

    class MainWindow(QMainWindow):

        def __init__(self):

            super().__init__()

            self.setWindowTitle("Slot Decorator Example")

            button = QPushButton("Click me")

            button.clicked.connect(self.button_clicked)

            self.setCentralWidget(button)

     

        @Slot()

        def button_clicked(self):

            print("Button clicked!")

     

    app = QApplication(sys.argv)

    window = MainWindow()

    window.show()

    app.exec()

    ```

     

    이 예제에서 `@Slot()` 데코레이터는 `button_clicked` 메서드를 슬롯으로 명확히 지정합니다.

     

    #### 파라미터가 있는 시그널

    시그널은 파라미터를 가질 수 있으며, 슬롯은 이러한 파라미터를 받을 수 있습니다. 다음 예제에서는 버튼 클릭 시 현재 시간을 출력합니다.

     

    ```python

    from PySide6.QtCore import QDateTime

     

    class MainWindow(QMainWindow):

        def __init__(self):

            super().__init__()

            self.setWindowTitle("Signal with Parameter Example")

            button = QPushButton("Click me")

            button.clicked.connect(self.button_clicked)

            self.setCentralWidget(button)

     

        @Slot()

        def button_clicked(self):

            current_time = QDateTime.currentDateTime()

            print("Current time:", current_time.toString())

     

    app = QApplication(sys.argv)

    window = MainWindow()

    window.show()

    app.exec()

    ```

     

    여기서 `button_clicked` 슬롯은 `QDateTime` 클래스를 사용하여 현재 시간을 출력합니다.

     

    ### 결론

    시그널과 슬롯 메커니즘은 Qt의 강력한 기능 중 하나로, 객체 간의 통신을 간단하게 처리할 수 있습니다. 기본 제공 시그널과 슬롯 외에도 사용자 정의 시그널과 슬롯을 생성하여 더 복잡한 상호작용을 구현할 수 있습니다. 다음 장에서는 다양한 위젯과 레이아웃을 사용하여 더 복잡한 GUI 애플리케이션을 만드는 방법을 살펴보겠습니다.

    import sys
    from PySide6.QtWidgets import (
        QApplication,
        QMainWindow,
        QPushButton
    )

    class MainWindow(QMainWindow):
        def __init__(self):
            super().__init__()
           
            self.setWindowTitle("My App")
           
            button = QPushButton("Press Me!")
            button.clicked.connect(self.the_button_was_clicked)
           
            self.setCentralWidget(button)
           
        def the_button_was_clicked(self):
            print("Clicked!")
           
           
    app = QApplication(sys.argv)

    window = MainWindow()
    window.show()

    app.exec()
     
    import sys
    from PySide6.QtWidgets import (
        QApplication,
        QMainWindow,
        QPushButton
    )

    class MainWindow(QMainWindow):
        def __init__(self):
            super().__init__()
           
            self.setWindowTitle("My App")
           
            self.button_is_checked = True
           
            button = QPushButton("Press Me!")
            button.setCheckable(True)
            button.clicked.connect(self.the_button_was_clicked)
            button.clicked.connect(self.the_button_was_toggled)
            button.setChecked(self.button_is_checked)
           
            self.setCentralWidget(button)
           
        def the_button_was_clicked(self):
            print("Clicked!")
           
        def the_button_was_toggled(self, is_checked):
            self.button_is_checked = is_checked
            print("Checked?", is_checked)
           
    app = QApplication()

    window = MainWindow()
    window.show()

    app.exec()
       
    import sys

    from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton

    class MainWindow(QMainWindow):
        def __init__(self):
            super().__init__()
           
            self.setWindowTitle("My App")
           
            self.button = QPushButton()
            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)
           
    app = QApplication()

    window = MainWindow()
    window.show()

    app.exec()
    import sys
    from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton

    from random import choice

    window_titles = [
        "My App",
        "Eplus",
        "App",
    ]

    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(slef, window_title):
            print("Window title changed: %s" % window_title)
           
    app = QApplication()
       
    window = MainWindow()
    window.show()
       
    app.exec()
    import sys
    from PySide6.QtWidgets import (
        QApplication,
        QMainWindow,
        QLabel,
        QLineEdit,
        QVBoxLayout,
        QWidget,
    )

    class MainWindow(QMainWindow):
        def __init__(self):
            super().__init__()
           
            self.setWindowTitle("My App")
           
            self.label = QLabel()
            self.input = QLineEdit()
            self.input.textChanged.connect(self.label.setText)
           
            layout = QVBoxLayout()
            layout.addWidget(self.input)
            layout.addWidget(self.label)
           
            container = QWidget()
            container.setLayout(layout)
           
            self.setCentralWidget(container)
           
    app = QApplication(sys.argv)

    window = MainWindow()
    window.show()

    app.exec()

    Goover의 시그널과 슬롯

    PySide6의 시그널과 슬롯은 GUI 애플리케이션 개발에서 중요한 개념으로, 사용자 인터페이스의 이벤트 처리와 관련이 깊습니다. 이 모델은 비동기적으로 발생하는 이벤트를 처리하는 데 유용하며, 객체 간의 통신을 쉽게 도와줍니다. 이제 이 개념을 자세히 설명하겠습니다.

    시그널과 슬롯의 기본 개념

    시그널은 특정 이벤트가 발생했음을 나타내는 신호입니다. 예를 들어, 버튼을 클릭할 때 버튼 객체는 “클릭됨” 시그널을 방출합니다. 반면 슬롯은 이러한 시그널을 처리하는 함수입니다. 다시 말해, 시그널이 발생하면 연결된 슬롯이 호출되어 이에 대한 응답을 처리하는 방식입니다.

    시그널과 슬롯의 동작 과정

    1. 시그널 정의: PySide6에서는 특정 객체에 시그널을 정의합니다. 예를 들어, 버튼을 생성할 때 clicked라는 시그널을 사용할 수 있습니다.
    2. 슬롯 작성: 이 시그널에 응답하는 함수를 작성합니다. 예를 들어, 버튼 클릭 시 메시지를 출력하는 함수를 만들 수 있습니다.
    3. 시그널과 슬롯 연결: connect 메서드를 사용하여 시그널과 슬롯을 연결합니다. 이렇게 하면, 특정 시그널이 발생했을 때 자동으로 관련 슬롯이 호출됩니다.
    4. 이벤트 발생: 사용자가 버튼을 클릭하면 clicked 시그널이 발생하고, 연결된 슬롯이 자동으로 호출되면서 정의한 작업을 수행합니다.

    예제 코드

    아래는 PySide6에서 시그널과 슬롯을 사용하는 간단한 예제입니다.

    from PySide6.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout, QLabel
    
    def on_button_clicked():
        label.setText("버튼이 클릭되었습니다!")
    
    app = QApplication([])
    
    window = QWidget()
    layout = QVBoxLayout()
    
    button = QPushButton("클릭하세요")
    label = QLabel("")
    
    layout.addWidget(button)
    layout.addWidget(label)
    
    window.setLayout(layout)
    
    # 시그널과 슬롯 연결
    button.clicked.connect(on_button_clicked)
    
    window.show()
    app.exec()
    

    위 코드에서는 버튼을 클릭하면 on_button_clicked라는 슬롯 함수가 호출되어 레이블의 텍스트가 변경됩니다.

    시그널과 슬롯의 장점

    • 비동기 처리: 시그널과 슬롯 모델은 UI가 사용자와 상호작용하는 동안에도 다른 작업을 수행할 수 있도록 해줍니다. 따라서 응답성이 뛰어난 애플리케이션을 만들 수 있습니다.
    • Loose Coupling: 객체 간의 결합도가 낮아지며, 코드의 유지보수와 확장성이 좋아집니다. 객체 간의 직접적인 종속성을 피할 수 있습니다.

    결론

    PySide6의 시그널과 슬롯은 GUI 프로그래밍에서 매우 강력한 도구로, 복잡한 이벤트 처리를 간단하고 명확하게 만들어줍니다. 이를 활용하면, 사용자와의 상호작용을 보다 직관적이고 비동기적으로 처리할 수 있습니다. 이러한 방식은 애플리케이션의 기능을 확장하거나 수정할 때도 큰 유연성을 제공합니다. PySide6를 이용한 GUI 개발에서 시그널과 슬롯의 개념을 꼭 익혀 두는 것이 중요합니다.

     

     

     

    728x90

    'PYTHON(파이썬) > PYSIDE6(GUI)' 카테고리의 다른 글

    PYSIDE6 레이아웃  (0) 2024.10.22
    PYSIDE6 위젯  (0) 2024.10.21
    PYSIDE 첫번째 APP  (0) 2024.10.19
    QT?  (0) 2024.10.19
    GUI의 간략한 역사  (0) 2024.10.19
Designed by Tistory.