检查 QValidator 的状态

utd*_*mir 3 python pyqt

首先,抱歉我的英语不好。

我正在尝试从用户那里获取IP。我正在使用 QRegExpValidator 来检查用户输入。验证器成功阻止不需要的字符。但我想知道当用户单击按钮时它是一个正确的IP。当然,我可以手动检查文本,但似乎有更好的方法,使用 QValidator 的状态枚举。QValidator.Acceptable 是我需要检查的。但我不知道如何使用它

这是我需要使用的: http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qvalidator.html#State-enum

这是我尝试过的(从主程序中提取):

from PyQt4 import QtCore, QtGui
from functools import partial

class Gui(QtGui.QDialog):
    def __init__(self):
        QtGui.QDialog.__init__(self)

        editLayout=QtGui.QFormLayout()

        edit=QtGui.QLineEdit()
        edit.setMinimumWidth(125)
        regex=QtCore.QRegExp("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}")
        validator=QtGui.QRegExpValidator(regex, edit)

        edit.setValidator(validator)

        editLayout.addRow("Enter Client IP:", edit)

        button=QtGui.QPushButton("Add Client")
        button.clicked.connect(partial(self.addClientButtonClicked, edit, validator))

        layout=QtGui.QVBoxLayout()
        layout.addLayout(editLayout)
        layout.addWidget(button)

        self.setLayout(layout)

    def addClientButtonClicked(self, edit, validator):
        print("ip=", edit.text())
        print(validator.State==QtGui.QValidator.Intermediate)


app=QtGui.QApplication([])
g=Gui()
g.show()
app.exec_()
Run Code Online (Sandbox Code Playgroud)

期望的输出:

ip= 192.168.
False
ip= 192.168.2.1
True
Run Code Online (Sandbox Code Playgroud)

但这就是我得到的:

ip= 192.168.
False
ip= 192.168.2.1
False
Run Code Online (Sandbox Code Playgroud)

检查 QValidator 状态的正确方法是什么?

Eli*_*sky 5

你在这里没有做正确的事。比较:

validator.State==QtGui.QValidator.Intermediate
Run Code Online (Sandbox Code Playgroud)

将枚举类型与其值之一进行比较 - 这将始终如此False

请改用validate以下方法:

def addClientButtonClicked(self, edit, validator):
    print("ip=", edit.text())
    print(validator.validate(edit.text(), 0))
Run Code Online (Sandbox Code Playgroud)

那么结果192.168.2.1是:

('ip=', PyQt4.QtCore.QString(u'192.168.2.1'))
(2, 0)
Run Code Online (Sandbox Code Playgroud)

返回的元组的第一个元素validate是状态,您可以将其与 的各种状态进行比较QValidator

def addClientButtonClicked(self, edit, validator):
    state, pos = validator.validate(edit.text(), 0)
    print(state == QtGui.QValidator.Acceptable)
Run Code Online (Sandbox Code Playgroud)

打印True用于192.168.2.1