【问题标题】:PyQt4 User Input Validation - QlineEditPyQt4 用户输入验证 - QlineEdit
【发布时间】:2015-11-18 14:13:26
【问题描述】:

我在理解 PyQt4 的输入验证时遇到了一些问题。这是我的第一个 GUI 应用程序,也是第一次使用 PyQt4 框架。我一直在阅读 Class 参考资料,看起来进行文本验证的首选方法是通过 QRegularExpression 类,但这对于一些简单的输入验证来说似乎太过分了。

我的注册用户类中有一个方法可以将用户添加到 sqlite 数据库中。我还为 QlineEdits 创建了一个信号,该信号连接到一个验证文本的方法。 SQL 输入工作得很好,但由于某种原因输入验证不能。这不会导致错误。 MessageBoxes 只是不弹出。我知道我只创建了一个 SIGNAL,但这只是为了测试。

def newUser(self):                 #This method adds a new user into the login database and displays a pop up window confirming the entry
    c.execute("INSERT INTO logins(usernames, passwords)VALUES(?,?)", (self.userEdit.text(), self.passEdit.text())) #sql query inserts entries from line edit and pass edit into database
    c.commit() #Save database changes
    self.connect(self.userEdit, QtCore.SIGNAL("textchanged()"), self.validText)


def validText(self):
    if len(self.userEdit.text()) < 4:
        if len(self.passEdit.text()) < 4:
            self.msg = QtGui.QMessageBox.information(self, 'Message', 'Not enough characters!', QtGui.QMessageBox.Ok)       
        else:
            self.msg = QtGui.QMessageBox.information(self, 'Message', 'User added successfully', QtGui.QMessageBox.Ok)

从语义上讲,我知道这是有道理的,但我无法弄清楚我在语法上哪里出错了。有人可以告诉我,除了使用 len 之外,是否还有其他我应该研究的概念?

提前致谢!

【问题讨论】:

  • 第 1 步是使用调试器或至少使用 print 确保您的信号完全触发。我相信这个信号是区分大小写的,所以你需要 textChanged() 而不是 textchanged()。为什么不在初始化 userEdit 时将信号连接到您的 validText 插槽?我不确定您在哪里/如何调用 newUser(),但大概您想在向数据库提交任何内容之前验证用户名和密码
  • 感谢您的回答。这些都是好点,我一定会重新解决这个问题。我不知道为什么我将它设置为在验证之前提交更改。 @nb1987

标签: python regex validation user-interface pyqt4


【解决方案1】:

我希望我能理解您的问题,因此您的应用中某处有一个 QLineEdit。并且您想阻止用户输入“奇怪”字符,例如:~!@#$#%)(& ...等等,从我在您的问题中读到的内容,您使用从用户那里收集的输入来将其发送到数据库中,在这种情况下,如果是数据库,则需要避免再次发送这是代码:

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys


class main_window(QDialog):
    def __init__(self):
        QDialog.__init__(self)

        # Create QLineEdit
        le_username = QLineEdit(self)
        le_username.setPlaceholderText("Enter username")
        le_password = QLineEdit(self)
        le_password.setPlaceholderText("Enter password")

        # Create QLabel
        lb_username = QLabel("Username: ")
        lb_password = QLabel("Password: ")

        # Adding a layout
        self.setLayout(QVBoxLayout())


        # Adding widgets to layout
        self.layout().addWidget(lb_username)
        self.layout().addWidget(le_username)


        self.layout().addWidget(lb_password)
        self.layout().addWidget(le_password)


        #!! ReGex implementation !!
        # For more details about ReGex search on google: regex rules or something similar 
        reg_ex = QRegExp("[a-z-A-Z_]+")
        le_username_validator = QRegExpValidator(reg_ex, le_username)
        le_username.setValidator(le_username_validator)
        #!! ReGex implementation End !!


        #.......
        self.setMinimumWidth(200)
        self.setWindowTitle("ReGEX Validator in Python with Qt Framework")

app = QApplication(sys.argv)
dialog = main_window()
dialog.show()
sys.exit(app.exec_())

我希望这可以帮助您弄清楚如何在 QLineEdit 或任何您根据字符获得用户输入的地方过滤用户输入...

【讨论】:

  • 感谢您的回答!那么 ReGrex 和 QValidator 是在 PyQt4 中验证 Qline 输入时要走的路吗?这确实回答了我的问题。对于延迟回复,我深表歉意。
  • 很高兴听到这对您有所帮助
猜你喜欢
  • 2017-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-11
相关资源
最近更新 更多