QT Python 连接传递参数给函数
为什么这段代码能正常工作:
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()))