0

私のプログラムでは、データを表示するためにさまざまなビューを定義したいと考えています。私の最初の試行では、すべてのビューが 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
4

1 に答える 1

1

中央のウィジェットにスタックを使用します。

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_())
于 2015-02-25T21:48:35.260 に答える