PyQt5弹出窗口错误:QWidget :: setLayout:尝试设置已经有布局的QLayout

时间:2017-12-21 11:05:27

标签: python-3.x pyqt pyqt5

我有一个PyQt5 GUI应用程序,我正在尝试创建一个弹出窗口。我创建了一个类sideWindow,它由主窗口上的按钮调用。第一次从主GUI窗口调用sideWindow时,代码工作正常。但是,如果我关闭sideWindow并重新打开,我会收到错误并且窗口格式混乱:

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

我假设因为布局已经在第一次打开时设置,所以不需要再次设置。但是,我不确定我需要更改哪个sideWindow类来避免此错误。我尝试在clearLayout课程中设置sideWindow,但这没有帮助。

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()    

1 个答案:

答案 0 :(得分:0)

#Sergey建议的密钥是mcrypt_decrypt(MCRYPT_BLOWFISH... 每次调用时都会重新创建窗口。如下所示,我在setupWindow中添加了if语句。如果已经定义了弹出窗口(即通过先前加载),则识别小部件并且仅重新打开,而不是重新创建。修改后的函数setupWindow为:

setupWindow

此问题的完整MWE如下所示。这会创建一个小的GUI窗口('Main'),其中有一个按钮,可打开第二个窗口'Phasing',其中包含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()

QSpinBox