连接到插槽时如何向Qt PySide内置信号添加参数

H.J*_*ios 1 python qt pyside qlineedit

这是我要实现简单表达式评估器的类:

class mainWindow(QtGui.QMainWindow, mainGui.Ui_MainWindow):

    def __init__(*args, **kwargs)
        super(mainWindow, self).__init__(*args, **kwargs)
        self.setupUi(self)
        self.connecting_range_displays()

    def connecting_range_displays(self):    
        ranges = num_ranges()
        first_range = num_ranges.ones_range
        second_range = num_ranges.tens_range

        print first_range
        print second_range

        self.top_lineEdit.setText(str(first_range))
        self.bottom_lineEdit.setText(str(second_range))

        ex_a = first_range + second_range
        print "this is expressions answer", ex_a

        self.answer_lineEdit.returnPressed.connect(self.ex_evaluator)

    def ex_evaluator(self, right_answer):
        answer = self.answer_lineEdit.text()

        if ex_a == right_answer:
            print "Correct answer bucko"
Run Code Online (Sandbox Code Playgroud)

在一个简单的算术实践应用上面的代码我使用两行在一定范围内显示的随机数,并且第三QlineEditanswer_lineEdit我用它来获得用户输入,然后检查是否它的正确的I使用Signal returnPressed,并将其连接到ex_evaluator该然后会告诉您是否给出了正确的响应,问题似乎是我无法将ex_a参数传递给函数以进行评估,可能是名称空间问题,我在编码和我的哲学上是一个新手就是只学习最少的钱才能把我带到我想要的地方,所以我想知道我是否必须学习如何将QLineEdit我不知道该怎么做的子类化,我看到也许装饰师可能会帮上忙。我不想陷入麻烦。

Mik*_*oll 5

您需要执行以下操作之一:

  • 通过将ex_a更改为“ self.ex_a”,使其成为类属性。然后可以在课程中的任何地方使用
  • 使用lambda或functools.partial将其传递到广告位(ex_evaluator)

对于第二个选项,我编写了一个描述这两种方法的教程:http : //www.blog.pythonlibrary.org/2013/04/10/pyside-connecting-multiple-widgets-to-the-same-slot /

要使用lambda,请执行以下操作:

self.answer_lineEdit.returnPressed.connect(lambda ans=ex_a: self.ex_evaluator(ans))
Run Code Online (Sandbox Code Playgroud)

对于functools.partial,它将是这样的:

import functools
callback = partial(self.ex_evaluator, ex_a)
self.answer_lineEdit.returnPressed.connect(callback)
Run Code Online (Sandbox Code Playgroud)

如果您不了解最后一篇,则可能需要看一下文档