通过connect传递额外参数

10

是否可以通过插槽传递变量,以便我可以打印出特定的文本? 正在尝试将在另一个函数中定义的变量'DiffP'传递到插槽。

'DiffP'根据所选文件的不同而发生变化。

def addLineEdit(self):
    try:
        self.clearLayout()
        self.FileButton ={}
        self.Input = {}
        self.TotalInput = []
        for i in range(int(self.numberLine.text())):
            self.FileButton[i] = QtWidgets.QPushButton(self.centralwidget)
            self.FileButton[i].setText('Case {}'.format(i+1))
            self.FileButton[i].setFlat(True)
            self.FileButton[i].setMaximumSize(QtCore.QSize(50, 50))
            self.hboxlayout[0].addWidget(self.FileButton[i])
            self.FileButton[i].clicked.connect(lambda i=i: self.openfile(i))
            self.buttonGroup.addButton(self.FileButton[i],i)
            self.buttonGroup.buttonClicked['int'].connect(self.input)

def searchfile(self,dir):
        with open(dir) as f:
            content = f.readlines()
            MainList = content[44].split()
            RPM = round(float(MainList[0]), 2)
            Ps = round(float(MainList[1]), 2)
            Ts = round(float(MainList[2]), 2)
            Pd = round(float(MainList[3]), 2)
            Ratio = round(Pd / Ps, 2)
            DiffP = round(Pd - Ps, 2)
@pyqtSlot(int)
def input(self,button_or_id,DiffP):
    if isinstance(button_or_id, int):
        if button_or_id == 0:
            self.TotalInput[0].setText(str(DiffP))
        elif button_or_id == 1:
            self.TotalInput[54].setText('1')

def openfile(self,i):
    filename = QtWidgets.QFileDialog.getOpenFileName(self, 'Choose file')
    dir = filename[0]
    directory = os.path.split(dir)[0]
    return self.searchfile(dir)

这个回答解决了你的问题吗?Python中如何将参数传递给函数指针参数? - user202729
1个回答

23

问题可以通过两种方式解决:

使用lambda函数:

一般来说:

    obj.signal.connect(lambda param1, param2, ..., arg1=val1, arg2= value2, ... : fun(param1, param2,... , arg1, arg2, ....))

def fun(param1, param2,... , arg1, arg2, ....):
    [...]

其中:

  • param1,param2,...:是由信号发送的参数
  • arg1,arg2,...:是您想要使用的额外参数

在您的情况下:

    self.buttonGroup.buttonClicked['int'].connect(lambda i: self.input(i, "text"))

@pyqtSlot(int)
def input(self, button_or_id, DiffP):
    if isinstance(button_or_id, int):
        if button_or_id == 0:
            self.TotalInput[0].setText(DiffP)
        elif button_or_id == 1:
            self.TotalInput[54].setText('1')

使用 functools.partial:

通常情况下:

    obj.signal.connect(partial(fun, args1, arg2, ... ))

def fun(arg1, arg2, ..., param1, param2, ...):
    [...]

其中:

  • param1,param2,...:是信号发送的参数
  • arg1,arg2,...:是您想要发送的额外参数

在您的情况下:

from functools import partial

    [...]
    self.buttonGroup.buttonClicked['int'].connect(partial(self.input, "text"))


@pyqtSlot(int)
def input(self, DiffP, button_or_id):
    if isinstance(button_or_id, int):
        if button_or_id == 0:
            self.TotalInput[0].setText(DiffP)
        elif button_or_id == 1:
            self.TotalInput[54].setText('1')

我添加了更多的代码来展示我的问题。'DiffP'是另一个函数中的变量。一开始我没有很具体地说明。我使用slot来识别哪个按钮被按下,但我想从searchfile函数中获取变量并在slot中使用它们,这可能吗? - user8122158
1
是的,文件将根据用户选择而更改。因此,“DiffP”可能具有不同的值。 - user8122158
我从另一个函数中复制并粘贴了代码,但没有将其删除,我已更改上面的代码以反映这一点。 - user8122158
你的代码可以运行,但是你能返回变量而不是公式本身吗?我计划为每个按钮使用搜索文件函数中的多个变量。 - user8122158
运行“Untitled”,它应该运行其他内容。我修复了双重打开文件对话框,我将“self.buttonGroup.buttonClicked['int'].connect(self.input)”移到函数末尾,但仍然无法获取文本。 - user8122158
显示剩余17条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接