gpt4 book ai didi

python - 从 QValidator 获得视觉反馈

转载 作者:太空宇宙 更新时间:2023-11-04 11:10:46 26 4
gpt4 key购买 nike

我正在尝试使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com