使用 QDoubleValidator 限制 QLineEdit 输入并将值重置为最接近可接受的

问题描述

我想使用 QLineEdit 来获取用户输入的值。我想限制一个范围之间的输入,所以我应该使用 QDoubleValidator。我希望它能够工作,如果它们超过允许的值,它将文本设置为 top() 值,如果它们低于则将其设置为 bottom() 值。

我查看了使用 textChanged、returnpressed 和 inputRejected 信号。我遇到问题的原因是,一旦我使用范围设置验证器,returnpressed 将不会进入他们提到的 check_validator 函数 here。然后,我想也许我可以用输入拒绝信号来捕捉它,但由于某种原因,这似乎也不起作用。这是一些代码

class LineEdit(QLineEdit):
    def __init__(self,text,parent=None):
        super(LineEdit,self).__init__(parent)
        self.validator = QDouble Validator()
        self.setValidator(self.validator)
        self.text = text
        self.textChanged.connect(self.new_text)
        self.returnpressed(self.check_validator)

    def new_text(self,text):
        self.ntext = text

    def check validator:
        try:
            if float(self.ntext) > self.validator.top():
                self.text = str(self.validator.top()
            if float(self.ntext) < self.validator.bottom():
                self.text = str(self.validator.bottom()
            else:self.text = self.ntext
            self.setText(self.text)
         except:
            mssg = QMessageBox.about(self,"Error","Input can only be a number")
            mssg.exec()
            self.setText(self.text)

     def valRange(self,x1,x2):
         self.validator.setRange(x1,x2)

当窗口确实弹出时,我还收到一个属性错误,指出“nonetype”对象没有属性“exec”。我想我错过了如何正确关闭该窗口的步骤。

解决方法

keyPressEvent 为 false 时,您可以重新实现 hasAcceptableInput 以捕获回车。覆盖 text 属性还有一个缺点,现在对 setText 的任何编程调用都不会更新 QLineEdit 的文本。没有理由这样做。

class LineEdit(QLineEdit):
    def __init__(self,*args,**kwargs):
        super(LineEdit,self).__init__(*args,**kwargs)
        self.validator = QDoubleValidator(0,10,4,notation=QDoubleValidator.StandardNotation)
        self.setValidator(self.validator)
        self.textChanged.connect(self.new_text)
        self.returnPressed.connect(self.check_validator)
        self.ntext = None

    def keyPressEvent(self,event):
        super().keyPressEvent(event)
        if event.key() == Qt.Key_Return and not self.hasAcceptableInput():
            self.check_validator()

    def new_text(self,text):
        if self.hasAcceptableInput():
            self.ntext = text

    def check_validator(self):
        try:
            if float(self.text()) > self.validator.top():
                self.setText(str(self.validator.top()))
            elif float(self.text()) < self.validator.bottom():
                self.setText(str(self.validator.bottom()))
        except:
            mssg = QMessageBox.about(self,"Error","Input can only be a number")
            self.setText(self.ntext)