Я пытаюсь создать окно графического интерфейса, которое открывается с помощью центрального виджета, показывающего несколько вариантов на выбор. Каждый вариант заменяет центральный виджет новым окном, основанным на выборе пользователей. Подобно тому, как открываются программы, такие как 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)
и не загрузится главное окно.
Итак, есть ли стандартный способ сделать это, которого я пропущу? Я не уверен, что еще попробовать в данный момент.