通过 connect 传递额外的参数

Posted

技术标签:

【中文标题】通过 connect 传递额外的参数【英文标题】:Passing extra arguments through connect 【发布时间】:2017-07-13 21:12:40 【问题描述】:

是否可以通过插槽传递变量,以便我可以打印出某些文本? 试图将另一个函数中定义的变量“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, how to pass an argument to a function pointer parameter? 【参考方案1】:

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

使用 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 中使用它们,这可能吗? 是的,文件将根据用户选择进行更改。所以“DiffP”可能是不同的值。 我使用 QButtonGroup 来跟踪按钮并为每个按钮添加一个 id,我能想到的就是确保单击了哪个按钮 我是从另一个函数复制粘贴的,没有删除,我改了上面的代码体现出来。 以防我需要按键访问某个按钮

以上是关于通过 connect 传递额外的参数的主要内容,如果未能解决你的问题,请参考以下文章

如何传递额外参数以返回 PayPal Connect 的 url

Python、SQLAlchemy 在 connection.execute 中传递参数

从php表行传递参数

将 lambda 函数作为第三个参数传递给 QObject::connect 时出错

ThreadLocal(线程绑定)

ThreadLocal(线程绑定)