如何正确地将唯一字符串传递给信号函数?

时间:2019-04-25 15:30:53

标签: python pyqt pyqt5

尝试将唯一的字符串传递给QPushButton单击的插槽失败。

我使用pyqt5遍历一个字符串参数列表,以创建一个UI表单,布局如下:QLabel QLineEdit QPushButton-列表中每个参数一行。

QPushButton的点击信号连接到一个打开QFileDialog的功能,该功能允许用户选择该参数特定类型的文件或目录。参数传递:

@Input color: (string | boolean) = false;
  1. 我尝试创建/传递“ param”字符串的唯一副本   btn.clicked.connect(lamda:self.openFileDialog(copy.copy(param))

  2. 我尝试过使用for循环范围之外的字符串变量   即p =无        对于idx,枚举中的参数(general_params_list):           p =参数           btn.clicked.connect(lamda:self.openFileDialog(p))

  3. 再次使用范围播放-使用全局变量代替:self.p

  4. 我尝试创建并存储唯一按钮列表(而不是重新使用单个变量实例)。我在for循环外创建了列表,并在循环中对其进行了初始化。

  5. 通过创建/存储/使用复制的“ param”字符串列表来最终增强(4)。

 btn.clicked.connect(lamda: self.openFileDialog(param)

预期结果是每个功能插槽都传递了一个唯一的参数字符串,以便我可以区分按下哪个按钮。

实际结果是原始列表中的最后一个参数字符串被设置(传递)给所有按钮。即我正在传递/设置/使用对“参数”的引用,而不是其值?

1 个答案:

答案 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_())    

enter image description here