Python 如何在QlineEdit中仅输入小时格式

Python 如何在QlineEdit中仅输入小时格式,python,pyqt5,digits,qlineedit,hour,Python,Pyqt5,Digits,Qlineedit,Hour,我想指定一个QlineEdit,它只能输入这样的小时格式(24:00);因此,它只接受数字,最大值为24:00,其中初始值为00:00,当我修改小时数时,它会自动保留“:”。 谢谢。您可以使用“输入掩码” 备注 您的任务没有完全定义。如果违反了格式,会发生什么?是否用有效字符串覆盖条目?什么也不做?发送错误消息?如果输入时间>24小时,是否已违反格式?您可以使用“输入掩码” 备注 您的任务没有完全定义。如果违反了格式,会发生什么?是否用有效字符串覆盖条目?什么也不做?发送错误消息?如果输入时

我想指定一个QlineEdit,它只能输入这样的小时格式(24:00);因此,它只接受数字,最大值为24:00,其中初始值为00:00,当我修改小时数时,它会自动保留“:”。 谢谢。

您可以使用“输入掩码”


备注

您的任务没有完全定义。如果违反了格式,会发生什么?是否用有效字符串覆盖条目?什么也不做?发送错误消息?如果输入时间>24小时,是否已违反格式?

您可以使用“输入掩码”


备注


您的任务没有完全定义。如果违反了格式,会发生什么?是否用有效字符串覆盖条目?什么也不做?发送错误消息?如果输入时间>24小时,是否已违反格式?

您在Sven回答后所做的评论表明,您需要一个比最初要求的更健壮、更完整的解决方案。如果您想要完全自定义哪些类型的字符可以/不能添加到LineEdit中,并且想要运行测试输入的函数,则需要研究使用QValidator

如果您不太确定QValidator是什么:

QValidator是一个提供输入文本验证的类。什么时候 使用它,可以将其连接到QLineEdit、QSpinBox或QComboBox。 每当用户编辑连接字段时,每次 输入字符后,它运行一个
validate
函数,该函数可以 实现来运行您需要的任何逻辑,以查看它是否有效


这显示了使用QRegExpValidator解决问题的方法。但是,如果您仍然需要比正则表达式提供更多的检查(或者如果您对使用正则表达式感到不舒服),则需要将QValidator子类化,并实现
验证
功能。

Sven回答后您所做的评论表明,您需要一个比最初要求的更健壮、更完整的解决方案。如果您想要完全自定义哪些类型的字符可以/不能添加到LineEdit中,并且想要运行测试输入的函数,则需要研究使用QValidator

如果您不太确定QValidator是什么:

QValidator是一个提供输入文本验证的类。什么时候 使用它,可以将其连接到QLineEdit、QSpinBox或QComboBox。 每当用户编辑连接字段时,每次 输入字符后,它运行一个
validate
函数,该函数可以 实现来运行您需要的任何逻辑,以查看它是否有效


这显示了使用QRegExpValidator解决问题的方法。但是,如果您仍然需要比正则表达式提供更多的检查(或者如果您对使用正则表达式感到不舒服),您将需要对QValidator进行子类化,并实现
验证
功能。

一个可能的解决方案是使用一个带有小“hack”的QTimeEdit

QTime范围始终限制为00:00:00->23:59:59,但由于您只需要小时和分钟,因此可以使用分钟和秒而不是小时和分钟来“伪造”它。显然,如果你还需要显示秒数,这是不可能的

诀窍是将时间范围限制为00:00:00->00:24:00(注意,现在我们将最大时间设置为24分钟),并始终从/转换为正确的格式

我重写了
time
setTime
方法,因此您可以使用正确的HH:MM格式轻松获取/设置QTime。
timeChanged
信号也以类似方式被“覆盖”

我还修改了
stepBy
stepaenabled
方法,因为默认情况下,单步操作(滚轮、箭头按钮、页面/箭头键)仅限于光标所在的部分:如果光标位于分钟部分,则无法继续HH:59;通过我的实现,这个限制被删除,您可以轻松地从00:59转到01:00

class Time24Edit(QtWidgets.QTimeEdit):
    minTime = QtCore.QTime(0, 0)
    maxTime = QtCore.QTime(0, 24)
    _timeChanged = QtCore.pyqtSignal(QtCore.QTime)

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setDisplayFormat('mm:ss')
        self.setMinimumTime(self.minTime)
        self.setMaximumTime(self.maxTime)

        # "substitute" the base timeChanged signal with the custom one so that
        # we emit the correct HH:MM time
        self._baseTimeChanged = self.timeChanged
        self._baseTimeChanged.connect(self._checkTime)
        self.timeChanged = self._timeChanged

    def _checkTime(self, time):
        self.timeChanged.emit(self.time())

    def stepBy(self, step):
        fakeTime = super().time()
        seconds = fakeTime.second() + fakeTime.minute() * 60
        if self.currentSection() == self.SecondSection:
            seconds += step
        elif self.currentSection() == self.MinuteSection:
            seconds += step * 60
        # "sanitize" the value to 0-1440 "minutes"
        seconds = max(0, min(1440, seconds))
        minutes, seconds = divmod(seconds, 60)
        super().setTime(QtCore.QTime(0, minutes, seconds))

    def stepEnabled(self):
        fakeTime = super().time()
        steps = 0
        if fakeTime > self.minTime:
            steps |= self.StepDownEnabled
        if fakeTime < self.maxTime:
            steps |= self.StepUpEnabled
        return steps

    def time(self):
        # convert minutes/seconds to hours/minutes
        fakeTime = super().time()
        return QtCore.QTime(fakeTime.minute(), fakeTime.second())

    def setTime(self, time):
        # convert hours/minutes to minutes/seconds
        super().setTime(QtCore.QTime(0, time.hour(), time.minute()))

if __name__ == '__main__':
    def signalTest(time):
        print(time)

    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = Time24Edit()
    w.timeChanged.connect(signalTest)
    w.show()
    sys.exit(app.exec_())
class Time24Edit(qtwidts.QTimeEdit):
minTime=QtCore.QTime(0,0)
maxTime=QtCore.QTime(0,24)
_timeChanged=QtCore.pyqtSignal(QtCore.QTime)
定义初始化(self,*args,**kwargs):
super()
self.setDisplayFormat('mm:ss')
self.setMinimumTime(self.minTime)
self.setMaximumTime(self.maxTime)
#用自定义信号“替换”基准时变信号,以便
#我们发出正确的HH:MM时间
self.\u baseTimeChanged=self.timeChanged
self.\u baseTimeChanged.connect(self.\u checkTime)
self.timeChanged=self.\u timeChanged
def_检查时间(自我,时间):
self.timeChanged.emit(self.time())
def步进(自身,步进):
fakeTime=super().time()
秒=fakeTime.second()+fakeTime.minute()*60
如果self.currentSection()==self.SecondSection:
秒+=步长
elif self.currentSection()==self.MinuteSection:
秒+=步数*60
#将“清理”值设置为0-1440“分钟”
秒=最大值(0,最小值(1440,秒))
分,秒=divmod(秒,60)
super().setTime(QtCore.QTime(0,分,秒))
def步骤已启用(自):
fakeTime=super().time()
步数=0
如果fakeTime>self.minTime:
步数|=自我。已启用步数
如果fakeTime
A
class Time24Edit(QtWidgets.QTimeEdit):
    minTime = QtCore.QTime(0, 0)
    maxTime = QtCore.QTime(0, 24)
    _timeChanged = QtCore.pyqtSignal(QtCore.QTime)

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.setDisplayFormat('mm:ss')
        self.setMinimumTime(self.minTime)
        self.setMaximumTime(self.maxTime)

        # "substitute" the base timeChanged signal with the custom one so that
        # we emit the correct HH:MM time
        self._baseTimeChanged = self.timeChanged
        self._baseTimeChanged.connect(self._checkTime)
        self.timeChanged = self._timeChanged

    def _checkTime(self, time):
        self.timeChanged.emit(self.time())

    def stepBy(self, step):
        fakeTime = super().time()
        seconds = fakeTime.second() + fakeTime.minute() * 60
        if self.currentSection() == self.SecondSection:
            seconds += step
        elif self.currentSection() == self.MinuteSection:
            seconds += step * 60
        # "sanitize" the value to 0-1440 "minutes"
        seconds = max(0, min(1440, seconds))
        minutes, seconds = divmod(seconds, 60)
        super().setTime(QtCore.QTime(0, minutes, seconds))

    def stepEnabled(self):
        fakeTime = super().time()
        steps = 0
        if fakeTime > self.minTime:
            steps |= self.StepDownEnabled
        if fakeTime < self.maxTime:
            steps |= self.StepUpEnabled
        return steps

    def time(self):
        # convert minutes/seconds to hours/minutes
        fakeTime = super().time()
        return QtCore.QTime(fakeTime.minute(), fakeTime.second())

    def setTime(self, time):
        # convert hours/minutes to minutes/seconds
        super().setTime(QtCore.QTime(0, time.hour(), time.minute()))

if __name__ == '__main__':
    def signalTest(time):
        print(time)

    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = Time24Edit()
    w.timeChanged.connect(signalTest)
    w.show()
    sys.exit(app.exec_())