【发布时间】:2019-04-25 15:30:52
【问题描述】:
尝试将唯一字符串传递给 QPushButton 单击槽失败。
使用 pyqt5,我正在遍历字符串参数列表以创建一个 UI 表单,其布局如下: QLabel QLineEdit QPushButton -- 列表中的每个参数一行。
QPushButton 的点击信号连接到打开 QFileDialog 的函数,允许用户为参数选择特定类型的文件或目录。参数一起传递:
btn.clicked.connect(lamda: self.openFileDialog(param)
我已尝试创建/传递“param”字符串的唯一副本 btn.clicked.connect(lamda: self.openFileDialog(copy.copy(param))
我尝试在 for 循环范围之外使用字符串变量 即 p = 无 对于 idx,枚举中的参数(general_params_list): p = 参数 btn.clicked.connect(lamda: self.openFileDialog(p))
再次使用作用域 - 使用全局变量代替:self.p
我尝试创建和存储唯一按钮列表(而不是重新使用单个变量实例)。我在 for 循环之外创建了列表,并在循环中对其进行了初始化。
最后通过创建/存储/使用复制的“param”字符串列表进行扩充 (4)。
r = 0
ig1Layout = QGridLayout()
for idx, param in enumerate(general_params_list):
paramLabel = QLabel(param)
textLine = QLineEdit()
btn = QPushButton("..")
btn.clicked.connect(lambda: self.openFileDialog(param))
ig1Layout.addWidget(paramLabel, r, 0)
ig1Layout.addWidget(textLine, r, 1)
ig1Layout.addWidget(btn, r, 2)
r += 1
def openFileDialog(self, btnType):
print("\nopenFileDialog() - clicked on '..' open dialog for: ", btnType)
预期的结果是每个函数槽都传递了一个唯一的参数字符串,以便我可以区分按下了哪个按钮。
实际结果是原始列表中的最后一个参数字符串被设置(传递)给所有按钮。即我正在传递/设置/使用对“参数”的引用而不是它的值??
【问题讨论】:
-
将
btn.clicked.connect(lambda: self.openFileDialog(param))更改为btn.clicked.connect(lambda checked, param=param: self.openFileDialog(param))