본문으로 바로가기
반응형

QGridLayout QLayout 의 종류 중 하나입니다. 특징은 화면을 그리드 형태로 나누어서 X, Y 좌표로 컨트롤을 올리는 구조입니다. 위젯을 추가할 때 넘기는 QGridLayout addWidget(컨트롤객체, x, y) 에서 x 값이 열, y 값이 행의 개수를 뜻합니다. 엑셀의 셀 구조와 같습니다.

 

QMainWindow 화면에 QGridLayout 을 이용해 widget 을 추가하는 과정은 다음과 같습니다. QMainWindow 의 객체를 QWidget 의 생성자 파라미터로 넘기고, QWidget 에는 QGridLayout 을 추가합니다. 마지막으로 QGridLayout 에 올라갈 컨트롤 Widget 을 추가합니다. QGridLayout addWidget() 을 사용합니다. QMainWindow 화면에 QGridLayout QPushButton 이 추가된 위젯을 표시하기 위해 setCentralWidget() 함수를 사용합니다. 위젯은 화면 중앙에 표시됩니다.

 

위의 그림 1번에서 3번까지 과정에 대한 소스입니다. QWidget 의 생성자에 들어간 self QMainWindow 객체 입니다. 버튼은 2for 문을 돌면서 QGridLayout 에 다수의 QPushButton 을 추가했습니다.

widget = QWidget(self)

# QGridLayout 설정
gridlayout = QGridLayout(widget)
for i in range(0, 5):
    for j in range(0, 5):
        print(i)
        gridlayout.addWidget(QPushButton(str(i) + str(j)), i, j)

 

마지막 4번에 해당하는 소스는 다음과 같습니다. QMainWindow 에는 QWidget 객체를 추가하는데 setCentralWidget() 을 사용했습니다. 화면 중앙에 위젯을 표현합니다.

self.setCentralWidget(widget)

 

각 객체의 포함관계는 다음과 같습니다. QMainWindow 에는 QGridLayout 을 추가하기 위해서는 QWidget 이 필요합니다. 마지막에는 QWidget QMainWidow 에 추가하는 것입니다.

 

전체 소스는 다음과 같습니다. QGridLayout QPushButton 버튼 25 개를 for 문으로 추가한 뒤 QMainWindow 에 표시하는 소스입니다.

#!/usr/bin/env python3
import sys
from PyQt5.QtWidgets import QGridLayout, QMainWindow, \
    QPushButton, QApplication, QWidget


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        # 윈도우 설정
        self.setGeometry(50,50,600,300)  # x, y, w, h
        self.setWindowTitle('Status Window')

        # GridLayout 에 버튼 위치
        self.init_gridlayout()

    def init_gridlayout(self):
        widget = QWidget(self)

        # QGridLayout 설정
        gridlayout = QGridLayout(widget)
        for i in range(0, 5):
            for j in range(0, 5):
                print(i)
                gridlayout.addWidget(QPushButton(str(i) + str(j)), i, j)

        self.setCentralWidget(widget)


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


    mainWindow.show()
    sys.exit(app.exec_())

반응형