2015-08-11 2 views
1

Я хочу щелкнуть по меню меню «Инструменты», чтобы полностью изменить содержимое окна. Как это сделать с PySide? Должен ли я вызвать QAction и установить новый виджет как центральный с родителем старого окна? Я тоже начинаю на питоне и на английском. Пока я создал только одно окно.Как изменить содержимое в окне в PySide?

ответ

2

Во-первых, я бы определил каждый инструмент в своем собственном подклассе QWidget. Во-вторых, я бы добавил экземпляр каждого виджета инструмента, созданного таким образом, в макет центрального виджета главного окна. Наконец, я бы добавил действия в menuBar и подключил их к методам, чтобы показать и скрыть инструменты по своему желанию.

Ниже приведен пример, чтобы показать, как это может быть сделано с 2-мя различными инструментами:

from PySide import QtGui 
import sys 

class myApplication(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     super(myApplication, self).__init__(parent) 

     self.setWindowTitle('No Tool is Selected') 

     #---- create instance of each tool widget ---- 

     self.tool1 = Tool1(self) 
     self.tool2 = Tool2(self) 

     #---- layout for central widget ---- 

     centralWidget = QtGui.QWidget() 
     centralLayout = QtGui.QGridLayout() 
     centralLayout.addWidget(self.tool1, 0, 0) 
     centralLayout.addWidget(self.tool2, 1, 0) 
     centralWidget.setLayout(centralLayout) 

     self.setCentralWidget(centralWidget) 

     #---- set the menu bar ---- 

     contentMenu = self.menuBar().addMenu(("Tools")) 
     contentMenu.addAction('show Tool 1', self.show_Tool1) 
     contentMenu.addAction('show Tool 2', self.show_Tool2) 
     contentMenu.addAction('show All', self.show_All) 

    def show_Tool1(self): 
     self.tool1.show() 
     self.tool2.hide() 
     self.setWindowTitle('Tool #1 is Selected') 

    def show_Tool2(self): 
     self.tool1.hide() 
     self.tool2.show() 
     self.setWindowTitle('Tool #2 is Selected') 

    def show_All(self): 
     self.tool1.show() 
     self.tool2.show() 
     self.setWindowTitle('All Tools are Selected') 

class Tool1(QtGui.QWidget): 
    def __init__(self, parent=None): 
     super(Tool1, self).__init__(parent) 

     layout = QtGui.QGridLayout() 
     layout.addWidget(QtGui.QPushButton('Tool #1')) 
     self.setLayout(layout) 
     self.hide() 

class Tool2(QtGui.QWidget): 
    def __init__(self, parent=None): 
     super(Tool2, self).__init__(parent) 

     layout = QtGui.QGridLayout() 
     layout.addWidget(QtGui.QTextEdit('Tool #2')) 
     self.setLayout(layout) 
     self.hide() 

if __name__ == '__main__': 

    app = QtGui.QApplication(sys.argv) 
    instance = myApplication() 
    instance.show()  
    sys.exit(app.exec_()) 

Какие результаты в:

enter image description here

+0

Это прекрасно работает! Еще один вопрос: как заставить каждый инструмент иметь собственный заголовок окна. Я поместил 'self.setWindowTitle ("title")' в свой класс tool1 и tool2, но он не изменяется, когда инструмент выбран. –

+1

@HrvojeT То, что вы сделали, оказало бы влияние, если бы ваши инструменты были показаны в автономном окне. В приведенном выше примере каждый инструмент принадлежит 'myApplication', поскольку они были добавлены к его компоновке. Поэтому вам нужно вместо этого изменить заголовок окна 'myApplication'. Это можно сделать в методах, вызванных действиями menuBar. Я обновил этот пример, чтобы показать вам это. –

+1

@HrvojeT. Для упражнений удалите аргумент 'self' при создании экземпляра инструмента (например,' self.tool1 = Tool1() 'и прокомментируйте строки, в которые инструменты добавлены в макет' centralWidget' (например, ' centralLayout.addWidget (self.tool1, 0, 0) '). Теперь инструменты будут отображаться как автономное всплывающее окно при его выборе, а не отображаться в главном окне приложения, каждый со своим собственным независимым заголовком окна. –

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