2017-12-21 3 views
0

PyQt5 GUI 응용 프로그램이 있는데 팝 아웃 창을 만들려고합니다. 메인 윈도우의 버튼으로 호출되는 클래스 sideWindow을 만들었습니다. 이 코드는 기본 GUI 창에서 sideWindow이 처음 호출 될 때 올바르게 작동합니다. 나는 sideWindow를 닫고 다시 열 경우, 나는 엉망 오류 및 윈도우의 포맷을 취득 :PyQt5 팝업 창 오류 : QWidget :: setLayout : 이미 레이아웃이있는 QLayout을 설정하려고 시도했습니다.

QWidget::setLayout: Attempting to set QLayout "" on sideWindow "", which already has a layout

나는이에서 가정이 레이아웃은 이미 개방의 처음에 설정되어 있기 때문에 , 다시 설정할 필요가 없습니다. 그러나이 오류를 피하기 위해 sideWindow 클래스의 어느 비트를 변경해야하는지 잘 모르겠습니다. sideWindow 클래스에서 clearLayout 설정을 시도했지만 도움이되지 않았습니다. #Sergey에 의해 제안

class sideWindow(QWidget): 
    def __init__(self, parent): 
     super().__init__() 
     self.viewer = parent 

    def initiateMenuBar(self): 
     self.setWindowTitle('Phasing') 
     self.setWindowModality(Qt.ApplicationModal) 
     MenuBar = QVBoxLayout() 
     self.labels = { 
      'phase 0': QLabel('Phase 0', self), 
     } 
     self.inputs = { 
      'phase 0 sl': QSlider(Qt.Horizontal),   
      'phase 0': QDoubleSpinBox(self), 
     } 

     for i in self.inputs.values(): 
      i.installEventFilter(self) 

     class dividor(QFrame): 

      def __init__(self, parent): 
       QFrame.__init__(self, parent) 
       self.setFrameShape(QFrame.HLine) 
       self.setLineWidth(3) 
       self.setFrameShadow(QFrame.Raised) 
       self.show() 

     self.inputs['phase 0'].valueChanged.connect(self.inputs['phase 0 sl'].setValue) 
     self.inputs['phase 0 sl'].valueChanged.connect(self.inputs['phase 0'].setValue) 

     MenuBar.addWidget(self.labels['phase 0']) 
     MenuBar.addWidget(self.inputs['phase 0']) 
     MenuBar.addWidget(self.inputs['phase 0 sl']) 
     MenuBar.addWidget(dividor(self)) 
     MenuBar.addStretch(1) 

     self.inputs['phase 0'].setValue(0) 

     return MenuBar 

    def setupWindow(self): 

     MenuBar = self.initiateMenuBar() 

     grid = QGridLayout() 
     grid.setSpacing(10)   

     grid.addLayout(MenuBar, 0, 0, 1, 2) 
     self.setLayout(grid) 
     self.setGeometry(0, 0, 400, 100) 
     self.show()  
+0

[mcve] – eyllanesc

+0

을 제공하십시오. setupWindow 메소드를 정의하여 sideWindow를 정의하고 표시하십시오. sideWindow가 정의 된 후이를 표시하는 메서드가 하나 더 정의되었습니다. setupWindow에서 self.show()를 제거하고 별도로 show를 호출 할 수 있습니다. 그런 다음 setupWindow를 한 번만 호출하고 필요한만큼 여러 번 표시합니다. – Sergey

+0

이것은 정말 도움이되는 설명 인 #Sergey이며 해결책을 제시해주었습니다. 아래에 내 대답을 올렸습니다. – 218

답변

0

의 핵심은, setupWindow 윈도우가 호출 될 때마다 다시 점이다. 아래에 표시된 것처럼 if 문을 setupWindow에 포함 시켰습니다. 팝 아웃 창이 이미 정의 된 경우 (즉, 이전에로드 한 경우) 위젯은 식별되고 다시 열리지 만 재 작성되지는 않습니다. 수정 된 기능 setupWindow은 다음과 같습니다

def setupWindow(self): 

    if not self.myWdg: 
     self.myWdg = QWidget() 

     MenuBar = self.initiateMenuBar() 

     grid = QGridLayout() 
     grid.setSpacing(10)   

     grid.addLayout(MenuBar, 0, 0, 1, 2) 
     self.myWdg.setLayout(grid) 
     self.myWdg.setGeometry(0, 0, 400, 100) 

    self.myWdg.show() 
    self.myWdg.activateWindow() 

이 질문에 대한 전체 MWE은 다음과 같습니다. 이것은 QSpinBox을 포함하는 두 번째 창 'Phasing'을 여는 버튼이있는 작은 GUI 창 ('Main')을 생성합니다.

import sys 
from PyQt5.QtCore import Qt 
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout, QGridLayout, QDoubleSpinBox,\ 
    QLabel 


class Example(QWidget): 

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

     self.initUI() 


    def initUI(self): 

     button = QPushButton('Button', self) 
     button.move(50, 50) 

     self.sideWindowTest = sideWindowTest(self) 
     button.clicked.connect(lambda: self.sideWindowTest.setupWindow()) 

     self.setGeometry(300, 300, 300, 220) 
     self.setWindowTitle('Main') 

     self.show() 

class sideWindowTest(object): 

    myWdg = None 

    def __init__(self, parent): 
     super().__init__() 
     self.viewer = parent 

    def initiateMenuBar(self): 
     self.myWdg.setWindowTitle('Phasing') 
     self.myWdg.setWindowModality(Qt.ApplicationModal) 
     MenuBar = QVBoxLayout() 
     self.labels = { 
      'phase 0': QLabel('Phase 0', self.myWdg), 
     } 
     self.inputs = { 
      'phase 0': QDoubleSpinBox(self.myWdg), 
     } 

     for i in self.inputs.values(): 
      i.installEventFilter(self.myWdg) 

     self.inputs['phase 0'].setValue(0) 

     MenuBar.addWidget(self.labels['phase 0']) 
     MenuBar.addWidget(self.inputs['phase 0']) 
     MenuBar.addStretch(1) 

     return MenuBar 

    def setupWindow(self): 

     if not self.myWdg: 
      self.myWdg = QWidget() 

      MenuBar = self.initiateMenuBar() 

      grid = QGridLayout() 
      grid.setSpacing(10)   

      grid.addLayout(MenuBar, 0, 0, 1, 2) 
      self.myWdg.setLayout(grid) 
      self.myWdg.setGeometry(0, 0, 400, 100) 

     self.myWdg.show() 
     self.myWdg.activateWindow() 


if __name__ == '__main__': 

    app = QApplication(sys.argv) 
    ex = Example() 
    sys.exit(app.exec_()) 
관련 문제