私のプログラムでは、データを表示するためにさまざまなビューを定義したいと考えています。私の最初の試行では、すべてのビューが on クラス (QtGui.QWidget) で定義されていました。しかし、ビューのコードが長くなり始め、インタラクティブな機能も追加したいので、異なるビューを個々のクラスに分けたいと考えています。
以下に、私の最初の試みを示します。ここではsetCentralWidget
、2 つのビューを切り替えるために使用しようとしていました。各ビューに切り替える前に、ビューの新しいインスタンスを生成する必要があります。そうしないと、実行時エラーが発生します。すべての 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