QGridLayout 을 알아보자.

 

GridLayout 이란?

 

꼭 파이큐티가 아니더라도 GUI 프로그램을 만들다 보면 항상 마주치는 것이 GRID(그리드) 라는 녀석이다. 코드를 시작하기 전에 이 문서에서 한번쯤 짚고 넘어가려고 한다.

 

[사전적 정의 - Collins 영어 사전]

 

A grid is something which is in a pattern of straight lines that cross over each other, forming squares. On maps the grid is used to help you find a particular thing or place.

 

- 그리드는 정사각형을 이루는 직선이 서로룰 교차하는 패턴을 말한다. 지도에서 장소나 사물을 찾을 때 도움을 준다.

한국어로는 보통 격자라고 번역을 한다. 바둑판이나 욕실 타일 같은 것을 그리드라고 하는데 건축 디자이너나 사용할 만한 용어라서 일상생활에서 잘 쓰이지는 않는다.

 

컴퓨터에는 2D 면적을 표현하기 위한 여러가지 좌표시스템이 존재한다. 중학수학에 배운 카르테시안 좌표계는 중앙에 시작점을 0, 0 으로 놓고 사방으로 뻗어나가는 방식이라 대부분의 사람들이 이 방법에 익숙할 수도 있다. 그러나 컴퓨터에서는 대부분 좌상단에서 우하향하는 방식으로 사용한다. x가 증가하면 오른쪽으로 이동하고 y가 증가하면 아래로 이동한다. 이거 적응하는데 시간이 걸린다. 중학수학을 배울 때 보통은 좌측하단에서 우측 상단으로 전개하는 개념을 갖기 때문이다.

 

그리드도 컴퓨터의 좌표 방식을 따르는데 그리드는 좌표가 아니라 하나의 사각형이므로 row (행)과 col(열)로 이동한다.

 

다음 윈도우창 처럼 전개한다. 그냥 그리드만 써서 GUI 레이아웃을 짜는 것 보다는 VBox 나 HBox 를 같이 사용하는게 보기가 좋다. 

 

(0, 0) (0, 1) ... ...

(1, 0) (1, 1) 

...

...

 

그리드는 QGridLayout 의 사용법은 어렵지 않다.

 

layout 인스턴스를 만들어서 addWidget (위젯, 행 row, 열 col) 을 입력하면 된다.

 

 

계산기를 같이 가상 패드가 있는 프로그램을 만들 때 Grid 레이아웃이 유용하다. 

 

from PyQt5.QtCore import Qt
from PyQt5 import QtGui
from PyQt5.QtWidgets import QApplication, QLabel, QWidget, QGridLayout
import sys

class Window(QWidget):
    def __init__(self):
        super().__init__()

        self.setGeometry(300, 300, 600, 500)

        layout = QGridLayout()
        self.setLayout(layout)

        label = QLabel("Label Grid 1 \n(row:0, col:0)")
        layout.addWidget(label, 0, 0)
        label.setAlignment(Qt.AlignCenter)
        label.setFont(QtGui.QFont('Hack', 15))

        label = QLabel("Label Grid 2\n(row:0, col:1)")
        layout.addWidget(label, 0, 1)
        label.setAlignment(Qt.AlignCenter)
        label.setFont(QtGui.QFont('Hack', 15))

        label = QLabel("Label Grid 3\n(row:1, col:0)")
        layout.addWidget(label, 1, 0)
        label.setAlignment(Qt.AlignCenter)
        label.setFont(QtGui.QFont('Hack', 15))

        label = QLabel("Label Grid 4\n(row:1, col:1)")
        layout.addWidget(label, 1, 1)
        label.setAlignment(Qt.AlignCenter)
        label.setFont(QtGui.QFont('Hack', 15))

app = QApplication(sys.argv)
screen = Window()
screen.show()
sys.exit(app.exec_())

 

공유하기

facebook twitter kakaoTalk kakaostory naver band