Python 带有lambda信号的PyQt复选框列表
我使用dict键作为复选框文本,从dict创建一些qcheckbox。 然后我使用Python 带有lambda信号的PyQt复选框列表,python,lambda,pyqt5,Python,Lambda,Pyqt5,我使用dict键作为复选框文本,从dict创建一些qcheckbox。 然后我使用lambda表达式将信号连接到更新函数。 我想传递给这个更新函数的是复选框的文本,因此每个lambda都有其特定的参数。 尽管如此,无论我点击哪个复选框,我总是会得到最后添加的小部件的文本。 我是否错过了使用lambda进行信号传递的关键概念 import sys from PyQt5.QtWidgets import QDialog, QCheckBox, QVBoxLayout, QApplication, Q
lambda
表达式将信号连接到更新函数。
我想传递给这个更新函数的是复选框的文本,因此每个lambda都有其特定的参数。
尽管如此,无论我点击哪个复选框,我总是会得到最后添加的小部件的文本。
我是否错过了使用lambda进行信号传递的关键概念
import sys
from PyQt5.QtWidgets import QDialog, QCheckBox, QVBoxLayout, QApplication, QSlider, QLabel
class Window(QDialog):
def __init__(self, parent=None):
super(Window, self).__init__(parent)
layout = QVBoxLayout()
cb_dict = {"cb1": False, "cb2": True, "cb3": False}
cb_widget_list = list()
for checkbox in cb_dict:
widget = QCheckBox(checkbox)
widget.stateChanged.connect(lambda: self.update(checkbox))
cb_widget_list.append(widget)
for widget in cb_widget_list:
layout.addWidget(widget)
self.setLayout(layout)
def update(self, origin: str):
print("Checkbox {} has changed".format(origin))
if __name__ == '__main__':
app = QApplication(sys.argv)
main = Window()
main.show()
sys.exit(app.exec_())
因此,输出总是复选框cb3已更改
void QCheckBox::stateChanged(int状态)
每当复选框的状态改变时,即当用户选中或取消选中复选框时,就会发出此信号
状态包含复选框的新Qt::CheckState
由于要传递另一个参数,因此应执行以下操作:
widget.stateChanged.connect(
lambda state, checkbox=checkbox: self.update(state, checkbox) # +++
)
这很有效,你能快速解释一下原因吗?@pope请参阅更新
import sys
from PyQt5.QtWidgets import QDialog, QCheckBox, QVBoxLayout, QApplication, QSlider, QLabel
class Window(QDialog):
def __init__(self, parent=None):
super(Window, self).__init__(parent)
layout = QVBoxLayout()
cb_dict = {"cb1": False, "cb2": True, "cb3": False}
cb_widget_list = list()
for checkbox in cb_dict:
widget = QCheckBox(checkbox)
widget.stateChanged.connect(
lambda state, checkbox=checkbox: self.update(state, checkbox) # +++
)
cb_widget_list.append(widget)
for widget in cb_widget_list:
layout.addWidget(widget)
self.setLayout(layout)
def update(self, state, origin: str): # + state
print("Checkbox {} has changed: {}".format(origin, state))
if __name__ == '__main__':
app = QApplication(sys.argv)
main = Window()
main.show()
sys.exit(app.exec_())