В моей программе я хочу определить разные виды, чтобы показать свои данные. В моих первых попытках все представления были определены в классе (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
Спасибо. Это функция, которую я искал. – BerndGit
Последующие вопросы: Мой виджет будет 'matplotlib.backends.backend_qt4agg.FigureCanvasQTAgg'. (1) Как проверить внутри виджета, если он виден? (2) Что происходит с событиями мыши? Self.fig.canvas.mpl_connect ('button_press_event', self.gpsonclick) ', если виджет не отображается? Эти события запускают действия в виджетах, которые не видны? – BerndGit
Хорошо. Я нашел ответ на вопрос (1): сравните'ApplicationWindow.stack.currentWidget 'с'View1.self' – BerndGit