2015-02-25 8 views
0

В моей программе я хочу определить разные виды, чтобы показать свои данные. В моих первых попытках все представления были определены в классе (QtGui.QWidget). Однако, поскольку код для просмотров начал увеличиваться, и я также хочу добавить интерактивные функции, я хочу разделить разные представления на отдельные классы.PyQt4: разные виды в centralWidget. Лучшая практика SW-Architecture

Ниже вы найдете мою первую попытку. Здесь я просто пытался использовать setCentralWidget для переключения между двумя видами. Я должен генерировать новые экземпляры представлений перед переключением на каждое представление. В противном случае я создам ошибку времени выполнения. Кажется, что каждый экземпляр View уничтожается, как только он больше не находится в центре.

Насколько я понимаю это право? Является ли предлагаемая структура кода нормально, или есть проблемы, ожидающие, если я структурирую свой код так? Любые другие предложения/рекомендации по этой проблеме?

import sys 
from PyQt4 import QtGui 

class View1Widget(QtGui.QWidget): 
    pass 
    # Describse View 1 of Data 

class View2Widget(QtGui.QWidget): 
    pass 
    # Describse View 2 of Data 

class ApplicationWindow(QtGui.QMainWindow): 
    def __init__(self): 
     QtGui.QMainWindow.__init__(self) 
     self.main_widget = QtGui.QWidget(self) 

     # Generate Instances of both views 
     self.View1 = View1Widget( self.main_widget) 
     self.View2 = View2Widget( self.main_widget) 

     # Init Central View 
     self.setCentralWidget(self.View1) 

     # Focus 
     self.main_widget.setFocus() 

     self.views_menu = QtGui.QMenu('&Views', self) 
     self.views_menu.addAction('View 1', self.showView1) 
     self.views_menu.addAction('View 2', self.showView2) 
     self.menuBar().addMenu(self.views_menu) 

    def showView1(self): 
     "Switches Central Widget to View1" 
     self.View1 = View1Widget( self.main_widget) # Without this line, I would generate a runtime error 
     self.setCentralWidget(self.View1)  

    def showView2(self): 
     "Switches Central Widget to View2" 
     self.View2 = View2Widget( self.main_widget) # Without this line, I would generate a runtime error 
     self.setCentralWidget(self.View2) 




if __name__ == '__main__': 
    qApp = QtGui.QApplication(sys.argv) 
    aw = ApplicationWindow() 
    aw.show() 
    sys.exit(qApp.exec_()) 

Без отмеченные строки я получаю следующую ошибку во время выполнения после нажатия на View 2 и чем вернуться, чтобы посмотреть 1

Exception "unhandled RuntimeError" 
wrapped C/C++ object of type View1Widget has been deleted 

ответ

1

Используйте stack для центрального виджета:

import sys 
from PyQt4 import QtGui 

class ApplicationWindow(QtGui.QMainWindow): 
    def __init__(self): 
     QtGui.QMainWindow.__init__(self) 
     self.stack = QtGui.QStackedWidget(self) 
     self.View1 = QtGui.QLabel('View 1', self.stack) 
     self.View2 = QtGui.QLabel('View 2', self.stack) 
     self.stack.addWidget(self.View1) 
     self.stack.addWidget(self.View2) 
     self.setCentralWidget(self.stack) 
     menu = self.menuBar().addMenu('&Views') 
     menu.addAction('View 1', lambda: self.showView(0)) 
     menu.addAction('View 2', lambda: self.showView(1)) 

    def showView(self, index): 
     self.stack.setCurrentIndex(index) 

if __name__ == '__main__': 

    qApp = QtGui.QApplication(sys.argv) 
    aw = ApplicationWindow() 
    aw.show() 
    sys.exit(qApp.exec_()) 
+0

Спасибо. Это функция, которую я искал. – BerndGit

+0

Последующие вопросы: Мой виджет будет 'matplotlib.backends.backend_qt4agg.FigureCanvasQTAgg'. (1) Как проверить внутри виджета, если он виден? (2) Что происходит с событиями мыши? Self.fig.canvas.mpl_connect ('button_press_event', self.gpsonclick) ', если виджет не отображается? Эти события запускают действия в виджетах, которые не видны? – BerndGit

+0

Хорошо. Я нашел ответ на вопрос (1): сравните'ApplicationWindow.stack.currentWidget 'с'View1.self' – BerndGit

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

  • Нет связанных вопросов^_^