Как подключить pyqtSignal из класса внутри одного модуля к pyqtSlot в классе внутри другого модуля? - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть файл wizard.py:

class MyWizard(QWizard):
    def __init__(self):
        super().__init__()
        # ...

class PageOne(QWizardPage):
    def __init__(self):
        super().__init__()
        # ...

class FinalPage(QWizardPage):
    populateTable = pyqtSignal()

    def __init__(self):
        super().__init__()
        # ...

    def initializePage(self):
        finish_button = self.wizard().button(QWizard.FinishButton)
        finish_button.clicked.connect(self.populateTable.emit)

и другой файл main_ui.py:

import wizard

class UiMainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.table = QTableView(self)
        # ...

        self.my_wizard = wizard.MyWizard()
        self.my_wizard.exec_()
        # ...

        self.final_page = wizard.FinalPage()
        self.final_page.connect(self.populate_table)

    @pyqtSlot()
    def populate_table(self):
        # fill some data into self.table

Модуль main_ui импортирует модуль wizard и запускает мастер.

После запуска мастера я хочу вызывать метод populate_table() в main_ui.py каждый раз, когда закрываю мастер на последней странице, нажимая кнопку мастера sh.

Я попытался испустить pyqtSignal() из мастера и подключить его к методу UiMainWindow populate_table(), но, похоже, он не получает сигнал. Я использовал декоратор @pyqtSlot() на populate_table(), но это тоже не работает.

Однако передача сигнала из пользовательского класса внутри main_ui.py, к которому я подключился populate_table(), работает нормально. Но сигнал от класса внутри wizard.py не принимается.

Мой вопрос:

Можно ли подключить сигнал из класса в одном модуле к методу класса в другом модуле ?

1 Ответ

0 голосов
/ 02 апреля 2020

Как предполагает @Heike, сигнал должен быть определен в MyWizard вместо FinalPage.

Затем сигнал self.my_wizard.populateTable должен быть подключен к методу self.populate_table в UiMainwindow .

Уже было плохой идеей использовать finish_button в FinalPage для передачи сигнала, потому что ранее я уже подключил finish_button к self.wizard().restart(), что необходимо, так как Мастер выполняется с UiMainwindow. Это означает, что без вызова self.wizard().restart(), мастер всегда будет возрождаться на последней активной странице при следующем запуске (т. Е. На FinalPage).

Итак, чтобы отправить сигнал, Теперь я вызываю self.wizard().populateTable.emit() в методе initializePage для FinalPage, а затем подключаю его, как описано выше, внутри UiMainWindow с помощью метода populate_table.


Я переписал код соответствующим образом:

wizard.py

class MyWizard(QWizard):
    populateTable = pyqtSignal()

    def __init__(self):
        super().__init__()
        # ...

class PageOne(QWizardPage):
    def __init__(self):
        super().__init__()
        # ...

class FinalPage(QWizardPage):
    def __init__(self):
        super().__init__()
        # ...

    def initializePage(self):
        # need to keep finish_button connected to self.wizard().restart()
        finish_button = self.wizard().button(QWizard.FinishButton)
        finish_button.clicked.connect(self.wizard().restart)

        # emit the signal when switching to the last page
        self.wizard().populateTable.emit()

main_ui.py

import wizard

class UiMainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.table = QTableView(self)
        # ...

        self.my_wizard = wizard.MyWizard()
        self.my_wizard.populateTable.connect(self.populate_table)
        # ...

    def populate_table(self):
        # update the content in self.table

...