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.messageBox
将 messageBox
插槽连接到 button1
的 clicked
信号。然后打开消息框 (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_()
在 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.messageBox
将 messageBox
插槽连接到 button1
的 clicked
信号。然后打开消息框 (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_()