PyQt4:different 次在 centralWidget 中的查看次数。最佳实践 SW 架构
PyQt4:different views in centralWidget. Best practice SW-Architecture
在我的程序中,我想定义不同的视图来显示我的数据。在我的第一次尝试中,所有视图都是在 class (QtGui.QWidget) 中定义的。然而,由于视图的代码开始变得更长,而且我还想添加交互功能,所以我想将不同的视图分开到单独的 classes 中。
下面是我的第一次尝试。在这里,我只是尝试使用 setCentralWidget
在两个视图之间切换。在切换到每个视图之前,我必须生成新的视图实例。否则我会产生一个运行时错误。似乎每个 View 实例一旦不在 centralview 中就会被销毁。
我理解的对吗?
建议的代码结构是否正确,或者如果我这样构建我的代码会出现问题吗?
对于此类问题还有其他建议/最佳做法吗?
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_())
如果没有 标记的行,我会在单击视图 2 然后返回视图 1 后收到以下运行时错误
Exception "unhandled RuntimeError"
wrapped C/C++ object of type View1Widget has been deleted
为中央小部件使用 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_())
在我的程序中,我想定义不同的视图来显示我的数据。在我的第一次尝试中,所有视图都是在 class (QtGui.QWidget) 中定义的。然而,由于视图的代码开始变得更长,而且我还想添加交互功能,所以我想将不同的视图分开到单独的 classes 中。
下面是我的第一次尝试。在这里,我只是尝试使用 setCentralWidget
在两个视图之间切换。在切换到每个视图之前,我必须生成新的视图实例。否则我会产生一个运行时错误。似乎每个 View 实例一旦不在 centralview 中就会被销毁。
我理解的对吗? 建议的代码结构是否正确,或者如果我这样构建我的代码会出现问题吗? 对于此类问题还有其他建议/最佳做法吗?
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_())
如果没有 标记的行,我会在单击视图 2 然后返回视图 1 后收到以下运行时错误
Exception "unhandled RuntimeError"
wrapped C/C++ object of type View1Widget has been deleted
为中央小部件使用 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_())