如何在PyQt中连接到父SIGNAL?

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)

主窗口等待来自其他对话框的信号。现在,分类对话框中有另一个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()行中加载一次。
我想过需要将ChoosePatient内的一个槽与MainMenu内的“Show Classification”按钮的点击连接,但这需要MainMenu的实例,这是不可能的。
如何让ChoosePatient的一个方法在“父”窗口中的按钮点击时执行? (如果这不是使用pyqt窗口的正确方式,请告诉我)
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()

我的个人意见是让你的自定义类将内部功能封装得好好的,这样你只需要通过自定义类与它进行交互,而不需要深入了解其内部。这样一来,你可以在不破坏主窗口的情况下更改其内部运作方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接