QT Python 连接传递参数给函数

3 投票
1 回答
2520 浏览
提问于 2025-04-18 10:44

为什么这段代码能正常工作:

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, "aaaaa","bbbbbb"))

改成:

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()))

撰写回答