【问题标题】:How to enter only hour format in a QlineEdit如何在 QlineEdit 中仅输入小时格式
【发布时间】:2020-06-30 11:41:26
【问题描述】:

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

【问题讨论】:

  • 你不能改用QTimeEdit吗?
  • 我不能,因为我无法输入这个值“24:00”它变成了“23:59”,因为我不需要它作为一个小时,而是作为使用某些东西的时间

标签: python pyqt5 digits qlineedit hour


【解决方案1】:

根据 Sven 的回答,您制作的 cmets 表明您需要一个比您最初要求的更强大和更完整的解决方案。如果您想完全自定义哪些类型的字符可以/不能添加到 LineEdit 中并希望运行测试输入的函数,则需要考虑使用 QValidator。

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

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

link 显示了使用 QRegExpValidator 解决问题的方法。但是,如果您仍然需要比 RegEx 提供的更多检查(或者如果您对使用 RegEx 感到不舒服),则需要继承 QValidator 并实现 validate 函数。

【讨论】:

    【解决方案2】:

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

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

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

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

    我还修改了stepBystepEnabled 方法,因为默认情况下,步进操作(滚轮、箭头按钮、页面/箭头键)仅限于光标所在的部分:你不能走得更远 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_())
    

    【讨论】:

      【解决方案3】:

      您可以使用“输入掩码”。

      qline = QLineEdit("00:00")
      qline.setInputMask("HH:HH")
      

      备注

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

      【讨论】:

      • 我希望当有人输入字母或符号时它不会被修改!如果他输入的值大于 24:00,它会自动变为 24:00
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-23
      • 2019-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-23
      相关资源
      最近更新 更多