2014-10-07 3 views
0

Я пытаюсь создать окно графического интерфейса, которое открывается с помощью центрального виджета, показывающего несколько вариантов на выбор. Каждый вариант заменяет центральный виджет новым окном, основанным на выборе пользователей. Подобно тому, как открываются программы, такие как PyCharm и QtDesigner.PySide - сброс центрального виджета главного окна изнутри центрального виджета

В настоящее время я не могу выполнить эту работу. Это то, что я пробовал:

from PySide import QtCore, QtGui 
import sys 

class ControlMainWidget(QtGui.QWidget): 
    def __init__(self, parent=None, Widg = Opener()): 
     super(ControlMainWidget, self).__init__(parent) 
     self.widget = Widg 
     self.widget.setupUi(self) 
     if isinstance(Widg, Opener): 
      print(1) 
      QtCore.QObject.connect(self.widget.toolButton_3, QtCore.SIGNAL('clicked()'), MainWidgetChange(parent, widg=StatementView())) 
     print(2) 


class ControlMainWindow(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     super(ControlMainWindow, self).__init__(parent) 
     self.ui = Ui_MainWindow() 
     self.ui.setupUi(self) 

def MainWidgetChange(Window, widg = Opener()): 
    the_widget = ControlMainWidget(parent = Window, Widg = widg) 

    Window.setCentralWidget(the_widget) 

if __name__ == '__main__': 
    app = QtGui.QApplication(sys.argv) 
    mySW = ControlMainWindow() 
    MainWidgetChange(mySW) 
    mySW.show() 
    sys.exit(app.exec_()) 

открывалка и StatementView классы, сделанные с помощью QtDesigner так немного многословным. Я включу Opener, но StatementView составляет ~ 250 строк, поэтому я оставлю это отсюда.

class Opener(object): 
    def setupUi(self, Form): 
     Form.setObjectName("Form") 
     Form.resize(450, 400) 
     Form.setMinimumSize(QtCore.QSize(450, 400)) 
     Form.setMaximumSize(QtCore.QSize(450, 400)) 
     self.gridLayout = QtGui.QGridLayout(Form) 
     self.gridLayout.setObjectName("gridLayout") 
     self.toolButton = QtGui.QToolButton(Form) 
     self.toolButton.setMinimumSize(QtCore.QSize(150, 150)) 
     self.toolButton.setObjectName("toolButton") 
     self.gridLayout.addWidget(self.toolButton, 0, 0, 1, 1) 
     self.toolButton_2 = QtGui.QToolButton(Form) 
     self.toolButton_2.setMinimumSize(QtCore.QSize(150, 150)) 
     self.toolButton_2.setObjectName("toolButton_2") 
     self.gridLayout.addWidget(self.toolButton_2, 0, 1, 1, 1) 
     self.toolButton_3 = QtGui.QToolButton(Form) 
     self.toolButton_3.setMinimumSize(QtCore.QSize(150, 150)) 
     self.toolButton_3.setObjectName("toolButton_3") 
     self.gridLayout.addWidget(self.toolButton_3, 1, 0, 1, 1) 
     self.toolButton_4 = QtGui.QToolButton(Form) 
     self.toolButton_4.setMinimumSize(QtCore.QSize(150, 150)) 
     self.toolButton_4.setObjectName("toolButton_4") 
     self.gridLayout.addWidget(self.toolButton_4, 1, 1, 1, 1) 

     self.retranslateUi(Form) 
     QtCore.QMetaObject.connectSlotsByName(Form) 


    def retranslateUi(self, Form): 
     Form.setWindowTitle(QtGui.QApplication.translate("Form", "Form", None, QtGui.QApplication.UnicodeUTF8)) 
     self.toolButton.setText(QtGui.QApplication.translate("Form", "Tables", None, QtGui.QApplication.UnicodeUTF8)) 
     self.toolButton_2.setText(QtGui.QApplication.translate("Form", "Graphs", None, QtGui.QApplication.UnicodeUTF8)) 
     self.toolButton_3.setText(QtGui.QApplication.translate("Form", "Statements", None, QtGui.QApplication.UnicodeUTF8)) 
     self.toolButton_4.setText(QtGui.QApplication.translate("Form", "Modelling", None, QtGui.QApplication.UnicodeUTF8)) 

В настоящий момент окно нагрузка с открывалкой как центральный виджет - я могу также жесткий код его, чтобы установить StatementView в качестве центрального виджета без ошибок.

Однако, когда я использую вышеуказанные функции, при нажатии на панель инструментов в открывающем окне ничего не происходит. Я пытался заменить эту строку:

QtCore.QObject.connect(self.widget.toolButton_3, QtCore.SIGNAL('clicked()'), MainWidgetChange(parent, widg=StatementView()))

с

QtCore.QObject.connect(self.widget.toolButton_3, QtCore.SIGNAL('clicked()'), MainWidgetChange(self.parent, widg=StatementView()))

Который выдает следующее сообщение об ошибке:

Traceback (most recent call last): 
    File "/home/milo/Documents/Codes/Statements/New test code/mainui2.py", line 593, in <module> 
    MainWidgetChange(mySW) 
    File "/home/milo/Documents/Codes/Statements/New test code/mainui2.py", line 586, in MainWidgetChange 
    the_widget = ControlMainWidget(parent = Window, Widg = widg) 
    File "/home/milo/Documents/Codes/Statements/New test code/mainui2.py", line 575, in __init__ 
    QtCore.QObject.connect(self.widget.toolButton_3, QtCore.SIGNAL('clicked()'), MainWidgetChange(self.parent, widg=StatementView())) 
    File "/home/milo/Documents/Codes/Statements/New test code/mainui2.py", line 586, in MainWidgetChange 
    the_widget = ControlMainWidget(parent = Window, Widg = widg) 
    File "/home/milo/Documents/Codes/Statements/New test code/mainui2.py", line 570, in __init__ 
    super(ControlMainWidget, self).__init__(parent) 
TypeError: 'PySide.QtGui.QWidget' called with wrong argument types: 
    PySide.QtGui.QWidget(builtin_function_or_method) 
Supported signatures: 
    PySide.QtGui.QWidget(PySide.QtGui.QWidget = None, PySide.QtCore.Qt.WindowFlags = 0) 

и не загрузится главное окно.

Итак, есть ли стандартный способ сделать это, которого я пропущу? Я не уверен, что еще попробовать в данный момент.

ответ

0

Исправлено!

Я забыл, что события connect должны использовать функции как объекты (как в случае с скобками/аргументами). Я заключил в ящик функцию в событии connect в лямбда. Все работает сейчас.

Итак:

QtCore.QObject.connect(self.widget.toolButton_3, QtCore.SIGNAL('clicked()'), MainWidgetChange(parent, widg=StatementView()))

To:

QtCore.QObject.connect(self.widget.toolButton_3, QtCore.SIGNAL('clicked()'), lambda: MainWidgetChange(parent, widg=StatementView()))

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