3

次のような MainWindow があります。

def __init__(self, parent = None):

    QMainWindow.__init__(self, parent)
    self.setupUi(self)
    self.showMaximized()

    menu=mainMenu.MainMenu()

    classification=classificationMain.ClassificationMain()

    self.stackedWidget.addWidget(menu)
    self.stackedWidget.addWidget(classification)

    self.stackedWidget.setCurrentWidget(menu)
    self.stackedWidget.showFullScreen()

    #connections

    menu.pushButton.clicked.connect(self.showClassification)
    classification.backButton.clicked.connect(self.showMainWindow)

def showClassification(self ):
    self.stackedWidget.setCurrentIndex(3)

def showMainWindow(self):
    self.stackedWidget.setCurrentIndex(2)

MainWindows は残りのダイアログからの信号を待ちます。現在、分類ダイアログには別の StackedWidget があります。これは、アプリケーションの重要な部分のメイン ウィンドウとして機能するためです。次のようになります。

class ClassificationMain(QDialog, Ui_Dialog):

def __init__(self, parent = None):

    QDialog.__init__(self, parent)
    self.setupUi(self)
    choose=choosePatient.ChoosePatient()
    self.stackedWidget.addWidget(choose)
    self.stackedWidget.setCurrentWidget(choose)

今度は、MainMenu から「分類を表示」ボタンをクリックするたびに ChoosePatient 内のデータをリロードしたいのですが、MainWindow の classification=classificationMain.ClassificationMain() の行で 1 回だけデータがロードされるようになりました。

MainMenu 内の [分類を表示] ボタンをクリックして ChoosePatient 内のスロットを接続する必要があると考えていましたが、MainMenu のインスタンスが必要ですが、これは不可能です。

「親」ウィンドウのボタンがクリックされるたびにChoosePatientのメソッドを実行するにはどうすればよいですか? (また、これが pyqt ウィンドウを操作する正しい方法でない場合は教えてください)

4

1 に答える 1

2

構成されたウィジェットへの参照を保存し、いくつかのパブリック メソッドを親に公開する必要があります。

class ClassificationMain(QDialog, Ui_Dialog):

    def __init__(self, parent = None):

        QDialog.__init__(self, parent)
        self.setupUi(self)
        self.chooseWidget=choosePatient.ChoosePatient()
        self.stackedWidget.addWidget(self.chooseWidget)
        self.stackedWidget.setCurrentWidget(self.chooseWidget)

    def reloadPatients(self):
        # whatever your operation should be on the ChoosePatient
        self.chooseWidget.reload()


# MAIN WINDOW
def __init__(self, parent = None):
    ...
    self.classification=classificationMain.ClassificationMain()
    self.stackedWidget.addWidget(self.classification)
    ...
    #connections
    menu.pushButton.clicked.connect(self.showClassification)

def showClassification(self ):
    self.stackedWidget.setCurrentIndex(3)
    self.classification.reloadPatients()

reloadPatients必要に応じて、メソッドをスキップしてChoosePatient直接接続することもできます。

def showClassification(self ):
    self.stackedWidget.setCurrentIndex(3)
    self.classification.chooseWidget.reload()

私の個人的な意見は、カスタム クラスに内部機能を適切にラップして、カスタム クラスを介してインターフェイスするだけでよく、その内部を掘り下げないようにすることです。そうすれば、メイン ウィンドウを壊すことなく内部での動作を変更できます。

于 2012-11-17T18:56:20.733 に答える