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

PyQt5: Validate LineEdit through QPushButton using signals and slots

在 PyQt5 中将 QPushButton 连接到 QMessageBox 时遇到问题,因为与 PyQt4 相比,文档似乎很少。就目前而言,QmessageBox 在主布局之前执行,我认为这是 .self.exec_()?

某处的问题

然而,第二个也是主要的问题是关于连接两个小部件。我希望实施某种形式的有效性检查;即,当 QLineEdit 字段都包含文本时,单击 'Submit' 时,表单应清除字段,但是如果单击 'submit' 时任一字段留空,我喜欢QMessageBox待开通。我不确定如何实现它,因为我不知道如何将 textField 和 PushButton 连接在一起。

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

我尝试了几种不同的技术none,其中成功了

        self.connect(self.Button1, SIGNAL("clicked()"),self.clicked)
        def clicked(self):
        QMessageBox.about(self, "message!"(self.messageBox()))





if __name__ == "__main__":
    import sys
    from PyQt5.QtWidgets import QApplication
    app = QApplication (sys.argv)
    window = Buttons()
    window.show()
    sys.exit (app.exec_())

阅读您的程序并遵循执行路径。以 window = Buttons() 开头,这意味着 Buttons.__init__ 方法 运行s。在此您 运行 Buttons.messageBoxmessageBox 插槽连接到 button1clicked 信号。然后打开消息框 (self.message.exec_())。您的 __init__ 方法最终完成,然后 app.exec_() 被调用,这实际上显示了主 GUI 并启动了 Qt 事件循环,该循环处理诸如按钮点击和重绘事件之类的事情。

此时,您的程序已被告知要显示消息框,并配置为 运行 Buttons.messageBox 当您单击按钮时。当您单击该按钮时,它会显示消息框,并为该按钮建立一个额外的连接。下次您单击该按钮时,您将看到 2 个消息框!

解决方法是将信号连接从messageBox插槽中分离出来。与其在 __init__ 方法中调用 self.messageBox(),不如在此处为 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_()