通过 connect 传递额外参数

2024-12-20 08:37:00
admin
原创
151
摘要:问题描述:是否可以通过插槽传递变量以便我可以打印出某些文本?尝试将在另一个函数中定义的变量“DiffP”传递给插槽。“DiffP” 根据所选文件而变化。def addLineEdit(self): try: self.clearLayout() self.FileBut...

问题描述:

是否可以通过插槽传递变量以便我可以打印出某些文本?尝试将在另一个函数中定义的变量“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)

解决方案 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')

解决方案 2:

其他答案中建议的方法存在问题,

self.whatever.connect(lambda x: self.method(..., x))        # approach 1 (suboptimal)
self.whatever.connect(functools.partial(self.method, ...))  # approach 2 (suboptimal)

也就是说,它们会创建一个引用循环:对象self持有对带有信号的对象的引用(或本身就是该对象),而信号持有对函数或partial对象的引用,函数或对象持有对该对象的引用self。结果是(在 CPython 中)当对它们的所有其他引用消失时,这些对象都不会被垃圾回收;它们只会在下次循环收集器运行时被回收。它们反过来会保持它们引用的所有其他 Python 数据结构以及它们共同拥有的任何 Qt 对象处于活动状态。这不完全是内存泄漏,因为所有内容最终都会被释放,但这可能是一个问题。

如果你这样写,就不会出现引用循环

self.whatever.connect(self.method)

因为在 PyQt 和 PySide 中,connectPython 绑定方法对象都有一个特殊情况:它仅包含对“自身”对象的弱引用。functools.partial不返回connect可识别的特定类型的对象。但您可以定义一个functools.partial返回该类型的替代品,这样您就可以获得避免循环的行为:

def partial_bound_method(bound_method, *args, **kwargs):
    f = functools.partialmethod(bound_method.__func__, *args, **kwargs)
    # NB: the seemingly redundant lambda is needed to ensure the correct result type
    return (lambda *args: f(*args)).__get__(bound_method.__self__)

...

self.whatever.connect(partial_bound_method(self.method, ...))  # approach 2' (better)

请参阅这个较长的答案以了解更多详细信息。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用