我正在尝试使用QValidator后代(实际上是在PyQt5中,但这没关系)来验证一系列的行编辑。

一个小摘录是:

class IPv4(QWidget):
    def __init__(self):
        super(IPv4, self).__init__()
        uic.loadUi('ipv4.ui', self)
        self.address.inputMask = ''
        rx = QRegularExpression(r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}')
        self.address.setValidator(QRegularExpressionValidator(rx, self.address))
        self.netmask.setValidator(QRegularExpressionValidator(rx, self.netmask))
        self.gateway.setValidator(QRegularExpressionValidator(rx, self.gateway))
        self.broadcast.setValidator(QRegularExpressionValidator(rx, self.broadcast))
        self.dns1.setValidator(QRegularExpressionValidator(rx, self.dns1))
        self.dns2.setValidator(QRegularExpressionValidator(rx, self.dns2))
        self.on_dhcp_clicked(self.dhcp.isChecked())


这可以按照广告宣传的方式工作,但是用户不会得到任何反馈,因为尝试输入“错误”字符只会将其丢弃。

除了挂接到QLineEdit.textChanged信号并“手动”进行验证外,我没有找到任何反馈的方法(即:未设置验证器,否则发生错误text不会改变,也不会发出信号)。首选的反馈是更改行编辑的边框颜色。

这以某种方式破坏了验证器本身的目的。似乎我缺少了一些东西,因为我看不到如何触发QValidator的反馈。

处理此问题的“标准方法”是什么?

最佳答案

通过在子类中重新实现validate方法,可以使用自定义信号来指示验证状态更改。下面是演示此方法的脚本。 (请注意,validate的签名在PyQt中是不同的,因为它不会像C ++中那样对参数进行突变)。

import sys
from PyQt5 import QtCore, QtGui, QtWidgets

class RegExpValidator(QtGui.QRegularExpressionValidator):
    validationChanged = QtCore.pyqtSignal(QtGui.QValidator.State)

    def validate(self, input, pos):
        state, input, pos = super().validate(input, pos)
        self.validationChanged.emit(state)
        return state, input, pos

class Window(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        regexp = QtCore.QRegularExpression(r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}')
        validator = RegExpValidator(regexp, self)
        validator.validationChanged.connect(self.handleValidationChange)
        self.edit = QtWidgets.QLineEdit()
        self.edit.setValidator(validator)
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.edit)

    def handleValidationChange(self, state):
        if state == QtGui.QValidator.Invalid:
            colour = 'red'
        elif state == QtGui.QValidator.Intermediate:
            colour = 'gold'
        elif state == QtGui.QValidator.Acceptable:
            colour = 'lime'
        self.edit.setStyleSheet('border: 3px solid %s' % colour)
        QtCore.QTimer.singleShot(1000, lambda: self.edit.setStyleSheet(''))


if __name__ == "__main__":

    app = QtWidgets.QApplication(sys.argv)
    window = Window()
    window.show()
    sys.exit(app.exec_())

关于python - 从QValidator获得视觉反馈,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58278508/

10-12 22:17