2015-09-14 4 views
1

У меня есть разные файлы (main.py и layout.py), и я хочу изменить окна (я сократил пример, чтобы он изменил размер окна) QMainWindow из файла layout.py ,Вызов setCentralWidget из другого файла

Он отлично работает с main.py, я могу изменить окна из файла main.py, но это не влияет на layout.py.

UPDATE: Я сменил файлы на два рабочих примера с проблемой, что кнопка «Переключиться на макет 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) 

Может кто-нибудь объяснить мне, что я сделал не так?

ответ

2

В классах Layout есть параметр parent, поэтому используйте его. Вы должны получить ссылку на существующий экземпляр главного окна, а не создавать новую:

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

    ...   

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

Спасибо, что решить мою проблему. – maxie

Смежные вопросы