2

私はPyQT4が初めてで、以下の問題に直面しました。

一部のアプリケーションでは、1 つの画面でユーザーのデータを収集し、ボタンをクリックすると次の画面を表示する必要があります。

main.py

app = QtGui.QApplication(sys.argv)
#here I create main window with inherited class
w = SAN_MainWindow()
#and apply some basic geometry
w.SetUI()
#here first screen rendered and button event applyed
w.ApplyWidget( SAN_Intro() )
w.show()
sys.exit(app.exec_())

最初のウィジェットのレンダリングは正しく行われます。

SAN_MainWindow.py:

class SAN_MainWindow(QtGui.QMainWindow):
    def __init__(self ):
        super(SAN_MainWindow, self).__init__()

    def SetUI(self):
        self.setObjectName(_fromUtf8("MainWindow"))
        self.resize(789, 602)
        self.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8)) 
        self.central_widget = QtGui.QWidget(self)   
        self.central_widget.setObjectName(_fromUtf8("central_widget"))
        self.setCentralWidget(self.central_widget)

    def ApplyWidget( self, widget ):
        self.active_widget = widget
        self.active_widget.Setup(self.central_widget)
        self.active_widget.SetControls( self )

    def RemoveActiveWidget( self ):
        self.active_widget.widget().setParent(None)

    def ShowInstruction( self ):
        self.RemoveActiveWidget()
        self.ApplyWidget( SAN_Instruction() )
        #self.centralWidget().update() <- Problem

SAN_Intro.py:

class SAN_Intro(object):
    def __init__(self):
        super(SAN_Intro, self).__init__()

    def Setup(self, widget):
        self.gridLayoutWidget = QtGui.QWidget(widget)
        self.gridLayoutWidget.setGeometry(QtCore.QRect(80, 30, 638, 451))
        self.gridLayoutWidget.setObjectName(_fromUtf8("gridLayoutWidget"))
        self.gridLayout = QtGui.QGridLayout(self.gridLayoutWidget)
        self.gridLayout.setContentsMargins(-1, 16, 16, -1)
        self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
        #a lot of form inputs instructions....
    def SetControls( self, main_window ):
        QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL("clicked()"), main_window.ShowInstruction)

    def widget(self):
        return self.gridLayoutWidget

SAN_Instructionは SAN_Intro とほぼ同じですが、セットアップのコマンドが異なります。

class SAN_Instruction(object):

    def __init__(self):
        super(SAN_Instruction, self).__init__()

    def Setup(self, widget):
        self.verticalLayoutWidget = QtGui.QWidget(widget)
        self.verticalLayoutWidget.setGeometry(QtCore.QRect(40, 20, 591, 521))
        self.verticalLayoutWidget.setObjectName(_fromUtf8("verticalLayoutWidget"))
        self.verticalLayout = QtGui.QVBoxLayout(self.verticalLayoutWidget)
        self.verticalLayout.setMargin(0)
        self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
        #a lot of form inputs instructions.... 

    def SetControls( self, main_window ):
        pass

    def widget(self):
        return self.verticalLayoutWidget

そしてここに質問があります: 2 番目の (SAN_Instruction でオンフライで生成された) ウィジェットをどのように表示する必要がありますか? mainwindow/centralwidget/parent を更新/表示/再描画しようとしました。しかし、ボタンのクリックで得たのは self.RemoveActiveWidget() だけです。

私のコンセプトが間違っているのではないでしょうか?

事前にサンクス

4

2 に答える 2

2

コードは完全ではありませんが、hide()メソッドを利用することをお勧めします。これをボタン関数で定義して、表示したくないすべてのウィジェットを非表示にし、同じ関数でその場所に表示したいウィジェットを呼び出すことができます。プロジェクトがより整理され、追跡とデバッグが容易になるため、私はそのように使用します。さらに、これにより、show()メソッドを使用して、必要に応じてそのウィジェットを再び表示することもできます。

于 2011-11-25T11:55:06.150 に答える
0

「QtGui.QStackedWidget()」を使用できます。ウィンドウを多くのフレームに分割し、各フレームを QStackedWidget() に追加し、関数 setCurrentWidget() を使用して表示するフレームを選択します (フレームを切り替えます)。

self.central_widget.addWidget(self.mainFrame)
self.central_widget.setCurrentWidget(self.mainFrame)
于 2014-04-24T11:57:36.450 に答える