QT Python连接:将参数传递给函数

3
为什么这段代码有效:
from PySide.QtCore import *
from PySide.QtGui import *
import sys
from functools import partial

import pyside # my code generated by QT Design

class MainDialog(QMainWindow, pyside.Ui_MainWindow):

    def __init__(self, parent=None):
        super(MainDialog,self).__init__(parent)
        self.setupUi(self)


        self.connect(self.Connect_buttom, SIGNAL("clicked()"), partial(self.get_fb_token, "aaaaa","bbbbbb"))


    def get_fb_token(self,email,passwd): 
        print email
        print passwd


app = QApplication(sys.argv)
form = MainDialog()
form.show()
app.exec_()

并打印aaaaa和bbbbb

但是如果我改变:

self.connect(self.Connect_buttom, SIGNAL("clicked()"), partial(self.get_fb_token, self.FB_username.text() ,self.FB_password.text()))

它不会打印我在文本框FB_password和FB_username中输入的内容(它不会崩溃,但它不会打印任何东西,就好像它没有将两个参数发送到函数get_fb_token)???

** 参考自:http://www.blog.pythonlibrary.org/2013/04/10/pyside-connecting-multiple-widgets-to-the-same-slot/ 我正在使用QT和pyside

1个回答

2

partial对象是在定义连接时创建的,而不是在触发事件时创建的。这意味着在连接时调用FB_username.text(),因此它将始终打印您在设计器中设置的内容。

要实现您想要的效果,您必须使用一个在调用时检索这些值的函数。 最简单的解决方案是:

from PySide.QtCore import *
from PySide.QtGui import *
import sys

import pyside # my code generated by QT Design

class MainDialog(QMainWindow, pyside.Ui_MainWindow):

    def __init__(self, parent=None):
        super(MainDialog,self).__init__(parent)
        self.setupUi(self)

        # use new-style signals & slots!
        self.Connect_buttom.clicked.connect(self.get_fb_token)

    def get_fb_token(self):
        email = self.FB_username.text()
        password = self.FB_password.text()

        print email
        print passwd


app = QApplication(sys.argv)
form = MainDialog()
form.show()
app.exec_()

如果由于某些原因您不想修改get_fb_token,您可以使用如下的lambda

self.Connect_buttom.clicked.connect(lambda: self.get_fb_token(self.FB_username.text(), self.FB_password.text()))

谢谢!只是一个快速的问题。我如何从函数中获取结果?通常我只需要执行return something。我可以这样做吗:something = self.Connect_buttom.clicked.connect(self.get_fb_token)??? - Alberto
2
@Alberto 请参考Qt信号可以返回值吗?或者Qt:信号的返回值有效,为什么官方文档说这是不可能/禁止的?。我不会这样做,而是会发出一个新的(响应)信号。 - Trilarion
1
@Alberto 正如Trilarion所示,SO上已经有关于这个问题的资料。如果你有新的问题,请开一个新的问题。评论不应用于提出跟进问题或包含基本信息。 - Bakuriu

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