PyQt5:使用信号和插槽通过QPushButton验证LineEdit

时间:2015-10-26 19:49:38

标签: python qt python-3.x pyqt4 pyqt5

在PyQt5中将QPushButton连接到QMessageBox时遇到问题,因为与PyQt4相比,似乎没有什么文档。目前QmessageBox在主要布局之前执行我认为这是.self.exec_()的某个问题?

然而,第二个主要问题是关于连接两个小部件。我希望实施某种形式的有效性检查;即,当两个QLineEdit字段都包含文本时,单击“提交”时,表单应清除字段,但是如果在单击“提交”时其中一个字段留空,则ID为{{1}打开。我不确定如何实现它,因为我不知道如何将textField和PushButton连接在一起。

QMessageBox

我尝试过几种不同的技术,但都没有成功运作

from PyQt5.QtWidgets import QWidget, QLabel, QLineEdit,QSpinBox, 
QDoubleSpinBox, QComboBox, QRadioButton, QPushButton, QHBoxLayout, QVBoxLayout,
QTextEdit, QGridLayout, QApplication, QMessageBox

from PyQt5.QtCore import Qt, pyqtSlot
import csv

class Buttons (QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.Widgets()
        self.arrange()
        self.close()
        self.messageBox()
        self.setWindowTitle ("test")



    def Widgets(self):

        self.nameLabel = QLabel("Name: ")
        self.nameLineEdit = QLineEdit()
        self.surnameLabel = QLabel("Surname: ")
        self.surnameLineEdit = QLineEdit()


        self.button1 = QPushButton("submit")
        self.button2 = QPushButton("cancel")
        self.button1.setMaximumSize(150,20)
        self.button2.setMaximumSize(150,20)



    def arrange (self):

        nameField = QVBoxLayout()
        nameField.addWidget(self.nameLabel)
        nameField.addWidget(self.nameLineEdit)
        nameField.addWidget(self.surnameLabel)
        nameField.addWidget(self.surnameLineEdit)

        #QHBoxLayout for Buttons:
        buttonsLayout = QHBoxLayout()
        buttonsLayout.addWidget(self.button1)
        buttonsLayout.addWidget(self.button2)
        self.button1.setSizePolicy(10,10)
        self.button2.setSizePolicy(10,10)



        #Creating mainLayout:
        mainLayout = QVBoxLayout()
        mainLayout.addLayout(nameField)
        mainLayout.addLayout(buttonsLayout)

        self.setLayout(mainLayout)

    @pyqtSlot()
    def close(self):

        #close window
        self.button2.clicked.connect(app.quit)

    def clear(self):    
        pass
        #Clear textFields when button is clicked:   




    @pyqtSlot()
    def messageBox(self):
        self.message = QMessageBox()
        self.message.setText ("submit ERROR")
        self.message.setStandardButtons(QMessageBox.Ok)
        self.button1.clicked.connect(self.messageBox)

        self.message.exec_()

1 个答案:

答案 0 :(得分:0)

重温您的程序并遵循执行路径。从window = Buttons()开始,这意味着运行Buttons.__init__方法。在其中,您运行Buttons.messageBox,将messageBox广告连接到clicked信号button1。然后打开消息框(self.message.exec_())。您的__init__方法最终完成,然后app.exec_()被调用,实际显示主GUI并启动Qt事件循环,处理按钮点击和重绘事件等事项。

此时,您的程序已被告知显示消息框,并配置为在您单击按钮时运行Buttons.messageBox。单击该按钮时,它会显示消息框,并为该按钮创建其他连接。下次单击该按钮时,将显示2个消息框!

解决方案是将信号连接与messageBox插槽分开。不要在self.messageBox()方法中调用__init__,而是在那里为button1建立信号连接。

class Buttons (QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.Widgets()
        self.arrange()
        self.close()        
        self.button1.clicked.connect(self.messageBox)
        self.setWindowTitle ("test")

    @pyqtSlot()
    def messageBox(self):
        self.message = QMessageBox()
        self.message.setText ("submit ERROR")
        self.message.setStandardButtons(QMessageBox.Ok)

        self.message.exec_()