尝试将唯一的字符串传递给QPushButton单击的插槽失败。
我使用pyqt5遍历一个字符串参数列表,以创建一个UI表单,布局如下:QLabel QLineEdit QPushButton-列表中每个参数一行。
QPushButton的点击信号连接到一个打开QFileDialog的功能,该功能允许用户选择该参数特定类型的文件或目录。参数传递:
@Input color: (string | boolean) = false;
我尝试创建/传递“ 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)。
btn.clicked.connect(lamda: self.openFileDialog(param)
预期结果是每个功能插槽都传递了一个唯一的参数字符串,以便我可以区分按下哪个按钮。
实际结果是原始列表中的最后一个参数字符串被设置(传递)给所有按钮。即我正在传递/设置/使用对“参数”的引用,而不是其值?
答案 0 :(得分:0)
尝试一下:
import sys
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class Window(QWidget):
def __init__(self,parent=None):
super(Window,self).__init__(parent)
r = 0
general_params_list = ("param 1", "param 2", "param 3")
self.textLine_list = []
ig1Layout = QGridLayout(self)
for idx, param in enumerate(general_params_list):
paramLabel = QLabel(param)
self.textLine = QLineEdit()
self.textLine_list.append(self.textLine.text())
self.btn = QPushButton("btn{}".format(idx))
self.textLine.textChanged.connect(
lambda text, idx=idx : self.on_text_changed(text, idx))
self.btn.clicked.connect(
lambda state, param=param, i=idx : self.openFileDialog(param, i))
ig1Layout.addWidget(paramLabel, r, 0)
ig1Layout.addWidget(self.textLine, r, 1)
ig1Layout.addWidget(self.btn, r, 2)
r += 1
def openFileDialog(self, btnType, i):
print("\nopenFileDialog() - clicked on '..' open dialog for: ", btnType)
print("{} -> {}".format(btnType, self.textLine_list[i]))
def on_text_changed(self, text, idx):
self.textLine_list[idx] = text
if __name__ == '__main__':
app = QApplication(sys.argv)
main = Window()
main.show()
sys.exit(app.exec_())