如何在连接到Slot时为Qt PySide内置Signal添加参数

时间:2013-04-17 01:52:31

标签: 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"

在上面的简单算术练习应用程序的代码中,我使用两行来显示某个范围内的随机数,第三个QlineEditanswer_lineEdit我用它来获取用户输入,然后到检查是否正确我使用Signal returnPressed并将其连接到ex_evaluator,然后会告诉您是否给出了正确的答案,问题似乎是我无法通过函数的ex_a论证能够评估它,可能是命名空间问题,我是一个很新的编码,我的理念是只学到最少量的东西让我到达我想要的地方所以我'我想知道我是否必须学习如何继承我不知道怎么做的QLineEdit,我看到也许装饰者可能会帮助哪一个我不想进入的麻烦。

1 个答案:

答案 0 :(得分:4)

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

  • 通过将其更改为“self.ex_a”来使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))

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

import functools
callback = partial(self.ex_evaluator, ex_a)
self.answer_lineEdit.returnPressed.connect(callback)

如果您不理解最后一个,可能需要查看documentation