QstackLayout의 레이아웃 크기 설정이 되지 않습니다. 어떻게 해야될까요 ㅠㅠ

조회수 1282회

포커 게임에 배경사진을 palette통해서 삽입했습니다. 그런데 실제로 프로그램을 실행할때는 동작하지 않습니다... 단일 클래스로 실행할 때는 정상적으로 작동하던 코드인데 stack layout을 통해 위젯에 추가하면 사진이 나오지 않습니다.ㅠㅠ.. 제가 혹시 걔념적으로 잘못 알고있는게 있는걸까요?? 단일 클래스로 실행하던 클래스는 P_main클래스입니다.

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *

class Pwindow(QWidget): #Qwidth를 상속하는 메인 윈도우 QstackedLayout구현에 쓰임
    def __init__(self):
        super(Pwindow,self).__init__()

        self.Stack=QStackedWidget()
        self.SU1=P_main()
        self.SU2=P_play()

        self.Stack.addWidget(self.SU1)#처음 출력되는 메인화면
        self.Stack.addWidget(self.SU2)#난이도 버튼을 눌렀을 시 실행되는 화면
        self.layout=QGridLayout()

        self._init_ui()

    def _init_ui(self):
        self.resize(500,500)
        self.layout.addWidget(self.Stack)
        self.setLayout(self.layout)

class P_play(QWidget):

    def __init__(self):
        super().__init__()

        self._init_ui()

    def _init_ui(self):
        oimage = QImage("./white.JPG")

        palette = QPalette()
        palette.setBrush(10, QBrush(oimage))

        self.setPalette(palette)
        self.setWindowTitle("나혼자 인디언 포커!")

class P_main(QWidget):

    def __init__(self):
        super().__init__()

        self._init_ui()

    def _init_ui(self):
        oimage = QImage("./white.JPG")
        palette = QPalette()
        palette.setBrush(10, QBrush(oimage))

        btn1 = QPushButton('초급', self)
        btn2 = QPushButton('중급', self)
        btn3 = QPushButton('고급', self)

        hbox = QHBoxLayout()
        hbox.addStretch(1)
        hbox.addWidget(btn1)
        hbox.addStretch(1)
        hbox.addWidget(btn2)
        hbox.addStretch(1)
        hbox.addWidget(btn3)
        hbox.addStretch(1)

        hbox2 = QHBoxLayout()
        hbox2.addStretch(1)
        hbox2.addWidget(QLabel('나 혼자하는 인디언 포커'))
        hbox2.addStretch(1)

        vbox = QVBoxLayout()
        vbox.addStretch(1)
        vbox.addLayout(hbox2)
        vbox.addStretch(2)
        vbox.addLayout(hbox)
        vbox.addStretch(1)

        self.setLayout(vbox)
        self.setPalette(palette)
        self.setWindowTitle("나혼자 인디언 포커!")


if __name__ == '__main__':
    app=QApplication(sys.argv)
    ex=Pwindow()
    ex.show()
    sys.exit(app.exec_())

이미지도 첨부해놓겠습니다!이미지

  • 재현을 해볼 수 있는 코드를 올려주시기 바랍니다. 제일 좋은 방법은 레이아웃 관련이니 코드를 오류재현이 가능한 정도로만 최소로 해서 올려주세요. 정영훈 2019.12.28 17:37
  • 바로 다시 올렸습니다!! 조언해주셔서 감사합니다! 이태희 2019.12.28 21:29

2 답변

  • 좋아요

    1

    싫어요
    채택 취소하기
    import sys
    from PyQt5.QtCore import pyqtSlot, Qt
    from PyQt5.QtWidgets import *
    from PyQt5.QtGui import *
    
    class MyWidget(QWidget):
        def __init__(self, parent=None):
            super().__init__(parent)
    
            self.btn1 = QPushButton("Button1")
            self.btn1.clicked.connect(self.button_clicked)
    
            self.layout = QStackedLayout()
            self.layout.addWidget(P_play())
            self.layout.addWidget(self.btn1)
            self.setLayout(self.layout)
    
            self.layout.setCurrentIndex(1)
    
        @pyqtSlot()
        def button_clicked(self):
            self.layout.setCurrentIndex(0)
    
    class P_play(QWidget):
    
        def __init__(self, parent=None):
            super().__init__(parent)
    
            self._init_ui()
    
        def _init_ui(self):
            self.setAutoFillBackground(True)   # 추가
            oimage = QImage("./white.jpg")
    
            palette = QPalette()
            palette.setBrush(10, QBrush(oimage))
    
            self.setPalette(palette)
            #self.setWindowTitle("나혼자 인디언 포커!")
    
    
    class MyMain(QMainWindow):
        def __init__(self, parent=None):
            super().__init__(parent)
            win = MyWidget(self)
            # table.setStyle(QStyleFactory.create('Fusion'))
            self.setCentralWidget(win)
    
            self.statusbar = self.statusBar()
    
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        window = MyMain()
        window.resize(400, 200)
        window.show()
    
        sys.exit(app.exec_())
    
    • 아...그런거였군요ㅋㅋㅋ....제가 전혀 모르던 함수인데 알게해주셔서 정말 감사합니다!! 이태희 2019.12.29 21:34
    • 제가 보고있는 튜토리얼은 http://codetorial.net/pyqt5/index.html 사이트인데 pyqt5에 대해 조금 더 배울 수 있는 튜토리얼 사이트가 존재할까요??? 이태희 2019.12.29 21:36
    • pyqt 라는 것이 Qt 의 파이썬 확장모듈입니다. pyqt 자료보다는 Qt 자료가 많으므로 Qt 자료로 공부를 하시면 됩니다. Qt 서적은 국내서도 몇 되니 참고하기도 좋습니다. 언어만 c++이지 메소드들은 유사합니다. 정영훈 2019.12.30 02:16
    • 아... 그렇군요 ㅎㅎ 정말 갑사드립니다! 이태희 2019.12.31 16:06
  • 하려는 것이 무엇인지요? 일단 위의 코드도 일부만 올렸네요? 이미지도 없고...

    stack layout 이라는 것은 말 그대로 stack 처럼 위젯들이 쌓여있는 겁니다. 아래 예제를 테스트 해보세요. 실행하면 버튼이 나타나며 버튼을 클릭하면 table 위젯이 나타납니다.

    즉 버튼이 있는 위젯과 테이블이 있는 위젯이 각각 쌓여 있고 그것들중 노출하고 싶은 것을 노출할 수 있습니다.

    목적이 무엇인지 질문에 없어서 상세한 설명은 어렵네요.

    import sys
    from PyQt5.QtCore import pyqtSlot, Qt
    from PyQt5.QtWidgets import *
    from PyQt5.QtGui import *
    
    class MyWidget(QWidget):
        def __init__(self, parent=None):
            super().__init__(parent)
    
            self.btn1 = QPushButton("Button1")
            self.btn1.clicked.connect(self.button_clicked)
    
            self.layout = QStackedLayout()
            self.layout.addWidget(MyTable())
            self.layout.addWidget(self.btn1)
            self.setLayout(self.layout)
    
            self.layout.setCurrentIndex(1)    # Button1 보임
    
        @pyqtSlot()
        def button_clicked(self):
            self.layout.setCurrentIndex(0)    # table widget 보임
    
    class MyTable(QWidget):
        def __init__(self, parent=None):
            super().__init__(parent)
            self.setupUI(parent)
    
        def setupUI(self, parent):
            self.vbox = QVBoxLayout()
            self.tableWidget = QTableWidget(parent)
            self.vbox.addWidget(self.tableWidget)
    
            #self.vbox.addStretch(1)
            self.grid = QGridLayout()
            self.vbox.addLayout(self.grid)
    
            self.setGeometry(800, 200, 300, 300)
    
    
            self.tableWidget.setMinimumSize(290, 290)
            self.tableWidget.setRowCount(2)
            self.tableWidget.setColumnCount(2)
            self.setTableWidgetData()
    
            self.tableWidget.cellClicked.connect(self.mycell_clicked)
            self.tableWidget.verticalHeader().sectionClicked.connect(self.myheader_clicked)
    
            self.setLayout(self.vbox)
    
        def setTableWidgetData(self):
            self.tableWidget.setHorizontalHeaderLabels(["aaaa", "bbbb"])
    
            self.tableWidget.setItem(0, 0, QTableWidgetItem("(0,0)"))
            self.tableWidget.setItem(0, 1, QTableWidgetItem("(0,1)"))
            self.tableWidget.setItem(1, 0, QTableWidgetItem("(1,0)"))
            self.tableWidget.setItem(1, 1, QTableWidgetItem("(1,1)"))
    
        @pyqtSlot(int, int)
        def mycell_clicked(self, row, col):
            QMessageBox.information(self, '{}, {}'.format(row, col), '{}, {}'.format(row, col))
    
        @pyqtSlot(int)
        def myheader_clicked(self, logicalIndex):
            QMessageBox.information(self, str(logicalIndex + 1), str(logicalIndex + 1))
    
    class MyMain(QMainWindow):
        def __init__(self, parent=None):
            super().__init__(parent)
            win = MyWidget(self)
            # table.setStyle(QStyleFactory.create('Fusion'))
            self.setCentralWidget(win)
    
            self.statusbar = self.statusBar()
    
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        window = MyMain()
        window.resize(400, 200)
        window.show()
    
        sys.exit(app.exec_())
    
    • 우선 답변자님의 매우 친절하신 답변 감사드립니다. 게임 첫 화면에서 다음 화면을 넘어가기 위해stack layout을 사용하려했습니다. 아직까지 pyqt5튜토리얼 강의 사항들을 보면서 게임을 만들다보니 이전에 실습으로 사용하던 레이아웃 두개를 stack layout에 바로 적용시켜보았습니다. 버튼을 통한 핸들링은 추후에 기능을 추가할 생각이였구요. 그런데 실제로 stack layout에 레이아웃 두개를 넣어보니 제가 처음 사용하던 레이아웃은 사진 크기만큼 창이 크게 나왔는데 stack layout에 추가후 창크기가 최소 크기로 작아지고 배경사진도 출력이 되지않았습니다. 이런 오류가 발생한 이유를 도저히 알 수 없어서 질문드렸었는데, 아무래도 너무 애매모호하게 설명을 드렸던거같습니다. 답변자님의 코드를 꼼꼼히 살펴보니 stack layout자체에 크기가 설정되있어 바로 제 코드에도 적용해보았습니다. 창의 크기가 최소화되어 나오는 문제는 바로해결이되더군요. 실제로 최상위 레이아웃이 stack layout이란걸 간과하고있어 생긴 문제였습니다. 이태희 2019.12.29 04:23
    • 그런데 계속해서 이미지를 불러오는 과정에서 문제가 생기고있습니다. addwidget을 통해서 객체를 부르게되면 팔레트가 작동을 안하는걸까요??? 이태희 2019.12.29 04:47
    • 아...질문인 즉 white.jpg 가 배경으로 표시가 안된다는 이야기군요. 기본창은 배경이 자동으로 설정되는데 위젯의 경우에는 self.setAutoFillBackground(True) 을 주어야 합니다. 그러니까 def _init_ui(self): 다음라인에 self.setAutoFillBackground(True) 을 명시적으로 추가하세요. 정영훈 2019.12.29 05:55

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)