【发布时间】:2020-07-13 18:47:14
【问题描述】:
我有一个文件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 模块并启动向导。
启动向导后,我想在每次单击向导的完成按钮时在最后一页关闭向导时调用main_ui.py 中的populate_table() 方法。
我尝试从向导发出pyqtSignal() 并将其连接到UiMainWindow 的populate_table() 方法,但它似乎没有收到信号。我在populate_table() 上使用了@pyqtSlot() 装饰器,但这也不起作用。
但是,从我连接到populate_table() 的自定义类内部 main_ui.py 发出信号可以正常工作。但是没有收到来自wizard.py 内部类的信号。
我的问题:
有没有办法将来自一个模块中的类的信号连接到另一个模块中的类的方法?
【问题讨论】:
-
“发出一个`pyqtSignal()”是什么意思?我在您的课程中没有看到任何 pyqtSignal 声明。 Qt 信号必须在类定义中声明。
-
我已经编辑了我的问题。
-
@Joey 更改为
self.final_page.populateTable.connect(self.populate_table) -
@Joey 连接语法为:
sender.signal.connect(obj.slot) -
@Joey:在您发布的示例中,
self.final_page = wizard.FinalPage()将创建一个新的FinalPage实例,该实例独立于self.my_wizard中的最后一页。您需要将插槽连接到在self.my_wizard中显示的FinalPage实例的信号。您最好将信号populateTable从FinalPage移动到Wizard并在UiMainWindow中将self.my_wizard.populateTable连接到self.populate_table。
标签: python pyqt pyqt5 signals-slots