【问题标题】:How to limit numbers accepted in a Lineedit如何限制 Lineedit 中接受的数字
【发布时间】:2022-01-23 04:04:48
【问题描述】:

我正在尝试制作一个仅接受 1 到 12 数字的 Lineedit。但即使使用 setValidator,代码也无法限制数字。这是具有LineEdit 的函数。(lineEdit 不应接受不在 1-12 之间的数字)

使用Pyqt5 version 5.15.2 操作系统是“Windows 7”

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *

class Ui_mainWindow(QMainWindow):
    def setupUi(self, mainWindow):
        mainWindow.setObjectName("mainWindow")
        mainWindow.resize(562, 605)
        self.centralwidget = QtWidgets.QWidget(mainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setGeometry(QtCore.QRect(176, 91, 101, 31))
        self.lineEdit.setValidator(QtGui.QIntValidator(1, 12, self))
        self.labelOutput = QtWidgets.QLabel(self.centralwidget)
        self.labelOutput.setGeometry(QtCore.QRect(176, 122, 101, 16))
        self.listWidget = QtWidgets.QListWidget(self.centralwidget)
        self.listWidget.setGeometry(QtCore.QRect(10, 182, 541, 351))
        self.btnEnviar = QtWidgets.QPushButton(self.centralwidget)
        self.btnEnviar.setGeometry(QtCore.QRect(500, 149, 51, 31))
        self.btnEnviar.clicked.connect(self.print)
        mainWindow.setCentralWidget(self.centralwidget)
        QtCore.QMetaObject.connectSlotsByName(mainWindow)

        _translate = QtCore.QCoreApplication.translate
        mainWindow.setWindowTitle(_translate("mainWindow", "title"))
        self.lineEdit.setText(_translate("mainWindow", "01"))
        self.btnEnviar.setText(_translate("mainWindow", "Send"))
        self.labelOutput.setText(_translate("mainWindow", "Output Number:"))
        mainWindow.show()
        
    def print(self):       
        self.listWidget.addItem(self.lineEdit.text())
        comando = 'MS01INVE'+ self.lineEdit.text()  + '\r'
        self.listWidget.addItem(comando)

app = QApplication([])
mainWindow = QMainWindow()
ui = Ui_mainWindow()
ui.setupUi(mainWindow)
app.exec_()


【问题讨论】:

  • 请解释您所说的“不起作用”是什么意思,并提供一个实际的minimal reproducible example
  • 您提供的代码在概念上应该可以工作,所以问题一定出在其他地方,这就是为什么您必须提供 MRE:我们必须能够复制、粘贴和运行您的代码(可能没有任何实质性修改)并能够重现您的问题。现在你的代码不仅不会重现任何东西(任何事情都会发生,因为只有一个类声明),而且它还会引发 TypeError 异常并使程序崩溃。
  • 等等...您是否尝试在该范围内输入多个数字,同时,例如“1 10 8 5 11”?
  • 我尝试输入 1 到 12 之间的数字,代码必须只接受数组 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
  • 上面的代码就是这样做的。如果我输入 3,则输入被接受,如果我再次尝试输入,则没有变化。你能写出大于 12 的数字吗?如果是这种情况,请按要求提供 MRE。

标签: python python-3.x pyqt5 qlineedit


【解决方案1】:

根据QTBUG-82915,之前的行为已经改变。虽然新行为可能看起来出乎意料,但它documentation 一致:

请注意,值 999 返回中间值。由等于或小于最大值的数字组成的值被认为是中间值。这是因为阻止数字在范围内的数字不一定是最后输入的数字。这也意味着中间数可以有前导零。

提供范围限制值的所有可能例外几乎是不可能的,特别是如果目的是良好的性能。例如,在您的情况下,键入 9 会产生 Intermediate 值,但这不会阻止函数尝试添加行编辑值。

虽然验证器应该防止输入无效值是可以理解的,但从概念上讲,验证器应该只通知控制接口(QLineEdit)输入值无效,并且应该由接口负责处理它.

对此没有直接或直接的解决方案,因为它完全取决于使用输入和所需的行为。

由于主要目的是使用正确数据输入,一个可能的解决方案是清理函数中实际使用该输入的值:

class MainWindow(QMainWindow, Ui_mainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.lineEdit.setValidator(QtGui.QIntValidator(1, 12, self))
        self.btnEnviar.clicked.connect(self.printData)

    def printData(self):
        value = self.lineEdit.text()
        validator = self.lineEdit.validator()
        if not value.isdigit():
            self.lineEdit.setText(str(validator.bottom()))
            return
        else:
            intValue = int(value)
            correctValue = max(validator.bottom(), min(intValue, validator.top()))
            if correctValue != intValue:
                value = str(correctValue)
                self.lineEdit.setText(value)
        self.listWidget.addItem(value)
        comando = 'MS01INVE'+ value + '\r'
        self.listWidget.addItem(comando)

注意:我不得不更改您的原始代码并使用具有多重继承的实际 QWidget 子类 (QMainWindow)。那是因为您使用的pyuic 生成的文件也已被修改,这被认为是不好的做法。请遵循有关using Designer 的官方指南,以了解如何正确使用这些文件。

【讨论】:

    【解决方案2】:

    只要把 set maxlength 就好了。

    self.entry = QLineEdit(self)
    self.entry.setMaxLength(10) # in this example the limit is 10 characters.
    

    【讨论】:

    • 设置输入长度 not OP 的要求。
    猜你喜欢
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 2015-01-26
    相关资源
    最近更新 更多