从其他文件调用 setCentralWidget

Call setCentralWidget from other file

我有不同的文件(main.py 和 layout.py),我想更改 windows(我已经缩短了应该更改 window 大小的示例) 来自文件 layout.py 的 QMainWindow。

它在 main.py 中工作正常,我可以从文件 main.py 中更改 windows,但在 layout.py 中没有效果。

更新:我更改了文件两个工作示例,但问题是按钮 "Switch to Layout 2" 不起作用。

main.py

import sys
from PyQt5.QtWidgets import QAction, QApplication, QMainWindow
from layout import Layout1, Layout2

class MainClass(QMainWindow):
    def __init__(self):
    super(MainClass, self).__init__()

    def initUI(self):
    self.setGeometry(50, 100, 600, 500)
    self.setWindowTitle('program')


    self.window1Action = QAction('Window1', self)
    self.window1Action.triggered.connect(self.window1)
    self.window2Action = QAction('Window2', self)
    self.window2Action.triggered.connect(self.window2)

    self.menubar = self.menuBar()
    menu = self.menubar.addMenu('&Menu')
    menu.addAction(self.window1Action)
    menu.addAction(self.window2Action)

    self.show()

    def window1(self):
    wsize1 = (1200, 600)
    self.resize(*wsize1)
    self.form_widget = Layout1()
    self.setCentralWidget(self.form_widget)

    def window2(self):
    wsize2 = (600, 500)
    self.resize(*wsize2)
    self.form_widget = Layout2()
    self.setCentralWidget(self.form_widget)

if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = MainClass()
    ex.initUI()
    sys.exit(app.exec_())

layout.py

from PyQt5.QtWidgets import QFormLayout, QPushButton, QWidget

class Layout1(QWidget):

    def __init__(self, parent=None):
    super(Layout1, self).__init__(parent)

    self.form_layout = QFormLayout(self)

    self.button1 = QPushButton('Button1')
    self.form_layout.addRow('nonfunctional', self.button1)

    self.buttonX = QPushButton('Switch to Layout2')
    self.form_layout.addRow('Problem', self.buttonX)
    self.buttonX.clicked.connect(self.change_layout)

    self.setLayout(self.form_layout)

    def change_layout(self):
    from main import MainClass
    self.change_window = MainClass()
    self.change_window.window2()


class Layout2(QWidget):

    def __init__(self, parent=None):
    super(Layout2, self).__init__(parent)

    self.form_layout = QFormLayout(self)

    self.button2 = QPushButton('Button3')
    self.form_layout.addRow('nonfunctional', self.button2)

    self.setLayout(self.form_layout)

有人可以向我解释我做错了什么吗?

您的布局 类 有一个 parent 参数,所以请使用它。您需要获取对主要 window 的 现有实例 的引用,而不是创建新实例:

    def window1(self):
        ...
        self.form_widget = Layout1(self)
        self.setCentralWidget(self.form_widget)

    ...        

    def change_layout(self):
        self.parent().window2()