我有以下简化的代码,可以为Qt窗口生成窗口小部件。
information_models = [ models.Division,... ]
information_models_titles = [ 'Division',... ]
information_model_attrs = [ [ 'name' ],... ]
ctr = 0
for model,title,attrs in zip(information_models,information_models_titles,information_model_attrs):
...
add_btn = QPushButton('Add') # Assume this widget added to a layout somewhere below.
...
现在,我还需要将add_btn
的{{1}}信号连接到插槽功能。我通过在循环中包含以下代码来做到这一点。
clicked
这是add_btn.clicked.connect(
lambda : self._add_model_instance_action(model,attrs,model_instances_list)))
的代码,它只是向我们显示了一个对话框,允许您创建_add_model_instance_action(...)
的新实例/记录:
model
该方法没有任何错误。但是,所有按钮似乎都打开了相同的对话框,这是循环中@pyqtSlot()
def _add_model_instance_action(self,model,model_instances_list):
add_dialog = RecordDialogFactory.create_add_dialog(model,f'Add a new {title.lower()}')
add_dialog.show()
add_dialog.exec_() # Must do this to block execution of the
# code below until the dialog is closed.
...
的最后一个值。例如,如果我为模型model
和Division
创建“添加”按钮,并且最后创建了按钮,则这两个按钮都将打开Student
的对话框。幸运的是,我通过用以下代码替换了以前的信号插槽连接代码来解决了这个问题:
Student
为什么更改解决了我的问题?我怀疑这与如何将变量传递给函数以及lambda如何工作有关。