Python Qt4 如何在按钮点击时绑定动作

2 投票
1 回答
9479 浏览
提问于 2025-04-16 01:16

我正在尝试制作我的第一个Python应用程序。我想做一个简单的发邮件表单。

在Qt Designer中创建一个dialog.ui文件,然后从这个文件生成dialog.py,并在里面写函数。

def SendEmail(self,efrom,eto,esubj,ebody):
    msg = MIMEText( ebody.encode('UTF-8'),'html', 'UTF-8')
    msg['Subject'] = esubj
    msg['From'] = efrom
    msg['To'] = eto
    s = smtplib.SMTP()
    s.connect("mail.driversoft.net", 25)
    s.login("info@mysite.net", "1234567")
    s.sendmail(efrom, [eto], msg.as_string())
    s.quit()

然后我尝试连接到槽函数。

QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL("clicked()"), self.SendEmail("info@mysite.net", "test@mysite.net", "subject", "bodytext"))

当我尝试启动这个应用时,我没有看到表单,也没有在我的邮箱收到消息,控制台里也没有任何信息。

Traceback (most recent call last):
File "C:\Documents and Settings\a.ivanov\My Documents\Aptana Studio Workspace\test1\src\wxtest.py", line 61, in <module>
ui.setupUi(Dialog)
File "C:\Documents and Settings\a.ivanov\My Documents\Aptana Studio Workspace\test1\src\wxtest.py", line 33, in setupUi
QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL("clicked()"), self.SendEmail("info@mysqite.net", "test@mysite.net", "subject", "bodytext"))
TypeError: arguments did not match any overloaded call:
QObject.connect(QObject, SIGNAL(), QObject, SLOT(), Qt.ConnectionType=Qt.AutoConnection): argument 3 has unexpected type 'NoneType'
QObject.connect(QObject, SIGNAL(), callable, Qt.ConnectionType=Qt.AutoConnection): argument 3 has unexpected type 'NoneType'
QObject.connect(QObject, SIGNAL(), SLOT(), Qt.ConnectionType=Qt.AutoConnection): argument 2 has unexpected type 'bytes'

我该如何制作一个表单,让我可以输入主题和内容,然后按下发送按钮,最后通过邮件收到消息呢?谢谢!

完整代码如下:

from PyQt4 import QtCore, QtGui
import smtplib
from email.mime.text import MIMEText   

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(400, 330)
        self.textEdit = QtGui.QTextEdit(Dialog)
        self.textEdit.setGeometry(QtCore.QRect(10, 70, 381, 221))
        self.textEdit.setObjectName("textEdit")
        self.subjEdit = QtGui.QLineEdit(Dialog)
        self.subjEdit.setGeometry(QtCore.QRect(10, 30, 371, 20))
        self.subjEdit.setObjectName("subjEdit")
        self.pushButton = QtGui.QPushButton(Dialog)
        self.pushButton.setGeometry(QtCore.QRect(100, 300, 75, 23))
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtGui.QPushButton(Dialog)
        self.pushButton_2.setGeometry(QtCore.QRect(210, 300, 75, 23))
        self.pushButton_2.setObjectName("pushButton_2")
        self.label = QtGui.QLabel(Dialog)
        self.label.setGeometry(QtCore.QRect(10, 10, 46, 13))
        self.label.setObjectName("label")
        self.label_2 = QtGui.QLabel(Dialog)
        self.label_2.setGeometry(QtCore.QRect(11, 53, 46, 13))
        self.label_2.setObjectName("label_2")

        self.retranslateUi(Dialog)        
        QtCore.QObject.connect(self.pushButton_2, QtCore.SIGNAL("clicked()"), Dialog.close)        
        QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL("clicked()"), self.SendEmail("info@mysite.net", "test@mysite.net", "subject", "bodytext"))
        QtCore.QMetaObject.connectSlotsByName(Dialog)

 #this is my function
    def SendEmail(self,efrom,eto,esubj,ebody):
        msg = MIMEText( ebody.encode('UTF-8'),'html', 'UTF-8')
        msg['Subject'] = esubj
        msg['From'] = efrom
        msg['To'] = eto
        s = smtplib.SMTP()
        s.connect("mail.driversoft.net", 25)
        s.login("info@mysite.net", "1234567")
        s.sendmail(efrom, [eto], msg.as_string())
        s.quit()
        #print("done")

    def retranslateUi(self, Dialog):
        Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Dialog", None, QtGui.QApplication.UnicodeUTF8))
        self.pushButton.setText(QtGui.QApplication.translate("Dialog", "Send", None, QtGui.QApplication.UnicodeUTF8))
        self.pushButton_2.setText(QtGui.QApplication.translate("Dialog", "Close", None, QtGui.QApplication.UnicodeUTF8))
        self.label.setText(QtGui.QApplication.translate("Dialog", "Subject", None, QtGui.QApplication.UnicodeUTF8))
        self.label_2.setText(QtGui.QApplication.translate("Dialog", "Email text", None, QtGui.QApplication.UnicodeUTF8))


if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    Dialog = QtGui.QDialog()
    ui = Ui_Dialog()
    ui.setupUi(Dialog)    
    Dialog.show()
    sys.exit(app.exec_())

1 个回答

6
QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL("clicked()"), self.SendEmail("info@mysite.net", "test@mysite.net", "subject", "bodytext"))
QtCore.QObject.connect(self.pushButton, QtCore.SIGNAL("clicked()"), self.pushButtonClicked)

def pushButtonClicked(self):
    self.SendEmail("info@mysite.net", "test@mysite.net", "subject", "bodytext")

这不是信号和槽系统的工作方式。你的信号“clicked()”没有参数,所以你的槽也不能有参数。而且你必须传递回调的引用,而不是在连接时直接调用那个函数。

撰写回答