본문 바로가기
Python

PySide6로 GUI 구성하기

by holy season 2023. 5. 18.
반응형

PySide6로 GUI 구성하기

PySide6 설치

먼저 PySide6을 사용하려면 설치를 해야 한다.

pip 명령어를 사용해 pyside6을 설치하자

pip install pyside6

QtWidgets 클래스 불러오기

pyside6가 설치되었다면 QtWidgets 모듈을 불러와야 한다

QtWidgets 모듈은 PySide6 모듈 안에 있다.

from PySide6 import QtWidgets
import PySide6.QtWidgets

QApplication과 QWidget 객체 생성하기

QtWidgets 모듈을 성공적으로 불러왔으면 QtWidgets 안에 있는 QApplication 클래스와 QWidget 클래스를 생성해야 한다.

QWidget 클래스에 있는 show() 메서드는 만들어진 widget을 화면에 출력하는 메서드이다.

from PySide6 import QtWidgets
import sys

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    widget = QtWidgets.QWidget()
    widget.show()
    sys.exit(app.exec())

실행 화면

widget 객체에 아무것도 넣질 않아서 빈화면이 출력되었다.

widget 화면 구성하기

widget에 화면을 구성하려면 먼저 레이아웃을 정의한 다음 다른 widget을 생성한 다음 레이아웃에 추가해야 한다.

레이아웃 적용하기

PySide6의 레이아웃 종류로는 QStackedLayout, QGridLayout, QFormLayout, QBoxLayout, QVBoxLayout, QHBoxLayout이 있다.

다음과 같은 코드로 위에서 아래로 한 줄을 채우는 QVBoxLayout을 적용할 수 있다.

widget.setLayout(QtWidgets.QVBoxLayout())

위젯 생성하기

PySide6에는 위젯 종류가 많은데  자주 쓰일 거 같은 라벨, 리스트, 버튼을 생성해 보았다.

    labelWidget = QtWidgets.QLabel()
    labelWidget.setText("라벨")

    listWidget = QtWidgets.QListWidget()
    listWidget.addItem("리스트1")
    listWidget.addItem("리스트2")
    listWidget.addItem("리스트3")
    
    buttionWidget = QtWidgets.QPushButton()
    buttionWidget.setText("버튼")

레이아웃에 위젯 추가하기

labelWidget, listWidget, buttionWidget을 생성했으니 widget에 추가해야 한다.

widget에 추가하는 방법은 widget의 layout() 메서드로 QLayout을 불러와서 addWidget() 메서드의 인자값으로 넘겨주면 추가할 수 있다.

    widget.layout().addWidget(labelWidget)
    widget.layout().addWidget(listWidget)
    widget.layout().addWidget(buttionWidget)

전체 코드

그러면 다음과 같은 코드가 생성된다.

from PySide6 import QtWidgets
import sys

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)

    # 위젯 생성
    widget = QtWidgets.QWidget()

    # 라벨 위젯 생성
    labelWidget = QtWidgets.QLabel()
    labelWidget.setText("라벨")

    # 리스트 위젯 생성
    listWidget = QtWidgets.QListWidget()
    listWidget.addItem("리스트1")
    listWidget.addItem("리스트2")
    listWidget.addItem("리스트3")
    
    # 버튼 위젯 생성
    buttionWidget = QtWidgets.QPushButton()
    buttionWidget.setText("버튼")

    #위젯 레이아웃 설정
    widget.setLayout(QtWidgets.QVBoxLayout())
    widget.layout().addWidget(labelWidget)
    widget.layout().addWidget(listWidget)
    widget.layout().addWidget(buttionWidget)

    widget.show()
    sys.exit(app.exec())

실행 화면

제일 위쪽에는 라벨 위젯이 하나 생성되었고 중간에는 리스트 위젯 마지막에는 버튼이 생성되었다.

동작 추가하기

버튼을 눌렀을 경우 라벨의 내용을 선택된 리스트 아이템의 내용으로 바꾸고 싶다면 함수를 하나 생성하고 buttonWidget.clicked.connect(함수명)을 코드에 추가하면 된다.

from PySide6 import QtWidgets
import sys

def push():
    labelWidget.setText(listWidget.currentItem().text())

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)

    # 위젯 생성
    widget = QtWidgets.QWidget()

    # 라벨 위젯 생성
    labelWidget = QtWidgets.QLabel()
    labelWidget.setText("라벨")

    # 리스트 위젯 생성
    listWidget = QtWidgets.QListWidget()
    listWidget.addItem("리스트1")
    listWidget.addItem("리스트2")
    listWidget.addItem("리스트3")
    
    # 버튼 위젯 생성
    buttionWidget = QtWidgets.QPushButton()
    buttionWidget.setText("버튼")

    #위젯 레이아웃 설정
    widget.setLayout(QtWidgets.QVBoxLayout())
    widget.layout().addWidget(labelWidget)
    widget.layout().addWidget(listWidget)
    widget.layout().addWidget(buttionWidget)

    buttionWidget.clicked.connect(push)

    widget.show()
    sys.exit(app.exec())

실행 화면

리스트 아이템을 선택하고 버튼을 누르면 라벨의 내용이 변경된다.

중앙 정렬 하기

라벨의 위치가 왼쪽에 있는데 이것을 중앙으로 옮기려면 PySide6에서 Qtcore 모듈을 불러온 다음 labelWidget.setAlignment() 메서드를 사용하여 위치를 변경시키면 된다.

from PySide6 import QtWidgets, QtCore

labelWidget.setAlignment(QtCore.Qt.AlignmentFlag().AlignCenter)

실행 결과

라벨의 위치가 중앙으로 정렬된 것을 확인할 수 있다.

한 줄에 여러 개 위젯 추가하기

한 줄에 여러 개의 위젯을 추가하고 싶다면 QWidget 객체를 생성하고 QHBoxLayout 레이아웃을 적용한 뒤 보이고 싶은 위젯을 추가한 뒤 widget 객체에 추가하면 된다.

from PySide6 import QtWidgets, QtCore
import sys

def push():
    labelWidget.setText(listWidget.currentItem().text())

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)

    # 위젯 생성
    widget = QtWidgets.QWidget()

    # 라벨 위젯 생성
    labelWidget = QtWidgets.QLabel()
    labelWidget.setText("라벨")
    labelWidget.setAlignment(QtCore.Qt.AlignmentFlag().AlignCenter)

    labelWidget1 = QtWidgets.QLabel()
    labelWidget1.setText("라벨1")
    labelWidget1.setAlignment(QtCore.Qt.AlignmentFlag().AlignCenter)
    
    labelWidget2 = QtWidgets.QLabel()
    labelWidget2.setText("라벨2")
    labelWidget2.setAlignment(QtCore.Qt.AlignmentFlag().AlignCenter)

    #라벨 그룹 생성
    labelGroup = QtWidgets.QWidget()
    labelGroup.setLayout(QtWidgets.QHBoxLayout())
    labelGroup.layout().addWidget(labelWidget)
    labelGroup.layout().addWidget(labelWidget1)
    labelGroup.layout().addWidget(labelWidget2)

    # 리스트 위젯 생성
    listWidget = QtWidgets.QListWidget()
    listWidget.addItem("리스트1")
    listWidget.addItem("리스트2")
    listWidget.addItem("리스트3")
    
    # 버튼 위젯 생성
    buttionWidget = QtWidgets.QPushButton()
    buttionWidget.setText("버튼")

    #위젯 레이아웃 설정
    widget.setLayout(QtWidgets.QVBoxLayout())
    widget.layout().addWidget(labelGroup)
    widget.layout().addWidget(listWidget)
    widget.layout().addWidget(buttionWidget)

    buttionWidget.clicked.connect(push)

    widget.show()
    sys.exit(app.exec())

실행 화면

다음 화면과 같이 첫 번째 줄에 라벨, 라벨 1, 라벨 2가 중앙 정렬되어서 화면에 출력되었다.

라벨 그룹 빈 공간 없이 중앙 정렬하기

라벨마다 setAlignment() 메서드를 사용해서 중앙 정렬하게 되면 빈 공간이 생기게 되는데 이것을 없애고 싶다면 setAlignment() 메서드를 lebelGroup에 적용하면 된다.

from PySide6 import QtWidgets, QtCore
import sys

def push():
    labelWidget.setText(listWidget.currentItem().text())

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)

    # 위젯 생성
    widget = QtWidgets.QWidget()

    # 라벨 위젯 생성
    labelWidget = QtWidgets.QLabel()
    labelWidget.setText("라벨")

    labelWidget1 = QtWidgets.QLabel()
    labelWidget1.setText("라벨1")
    
    labelWidget2 = QtWidgets.QLabel()
    labelWidget2.setText("라벨2")

    #라벨 그룹 생성
    labelGroup = QtWidgets.QWidget()
    labelGroup.setLayout(QtWidgets.QHBoxLayout())
    labelGroup.layout().addWidget(labelWidget)
    labelGroup.layout().addWidget(labelWidget1)
    labelGroup.layout().addWidget(labelWidget2)
    labelGroup.layout().setAlignment(QtCore.Qt.AlignmentFlag().AlignCenter)

    # 리스트 위젯 생성
    listWidget = QtWidgets.QListWidget()
    listWidget.addItem("리스트1")
    listWidget.addItem("리스트2")
    listWidget.addItem("리스트3")
    
    # 버튼 위젯 생성
    buttionWidget = QtWidgets.QPushButton()
    buttionWidget.setText("버튼")

    #위젯 레이아웃 설정
    widget.setLayout(QtWidgets.QVBoxLayout())
    widget.layout().addWidget(labelGroup)
    widget.layout().addWidget(listWidget)
    widget.layout().addWidget(buttionWidget)

    buttionWidget.clicked.connect(push)

    widget.show()
    sys.exit(app.exec())

실행 화면

다음 화면과 같이 라벨들이 빈 공간 없이 중앙에 정렬된다.

반응형