Как ввести только часовой формат в QlineEdit

Я хочу указать QlineEdit, что он может вводить только такой часовой формат (24:00); поэтому он принимает только цифры, и его максимум составляет 24:00, где начальное значение равно 00:00, и когда я изменяю час, он автоматически сохраняет:. Спасибо.


person walid761    schedule 30.06.2020    source источник
comment
Разве вы не можете вместо этого использовать QTimeEdit?   -  person musicamante    schedule 30.06.2020
comment
Я не могу, потому что я не мог ввести это значение 24:00, оно становится 23:59, потому что мне это нужно не как час, а как время использования чего-либо.   -  person walid761    schedule 30.06.2020


Ответы (3)


Комментарии, которые вы сделали после ответа Свена, показывают, что вам нужно гораздо более надежное и полное решение, чем вы изначально просили. Если вы хотите полностью настроить, какие символы можно/нельзя добавлять в LineEdit, и хотите запускать функции, которые проверяют входные данные, вам нужно изучить возможность использования QValidator.

Если вы не совсем уверены, что такое QValidator:

QValidator — это класс, обеспечивающий проверку вводимого текста. При его использовании вы подключаете его к QLineEdit, QSpinBox или QComboBox. Всякий раз, когда пользователь редактирует подключенное поле, после каждого введенного символа он запускает функцию validate, которую можно реализовать для запуска любой логики, необходимой для проверки ее правильности.

Эта ссылка показывает решение вашей проблемы с помощью QRegExpValidator. Однако, если вам по-прежнему требуется больше проверок, чем может обеспечить RegEx (или если вам неудобно использовать RegEx), вам потребуется создать подкласс QValidator и реализовать функцию validate.

person Nicholas    schedule 30.06.2020

Возможным решением является использование QTimeEdit с небольшим взломом.

Диапазон QTime всегда ограничен 00:00:00 -> 23:59:59, но поскольку вам нужны только часы и минуты, вы можете подделать его, используя минуты и секунды вместо часов и минут. Очевидно, что если вам также нужно показывать секунды, это будет невозможно.

Хитрость заключается в том, чтобы ограничить временной диапазон 00:00:00 -> 00:24:00 (обратите внимание, что теперь у нас установлено максимальное значение 24 минуты) и всегда конвертировать из/в правильные форматы. .

Я перезаписал методы time и setTime, чтобы вы могли легко получить/установить QTime, используя правильный формат ЧЧ:ММ. Аналогичным образом перезаписывается сигнал timeChanged.

Я также модифицировал методы stepBy и stepEnabled, потому что по умолчанию пошаговые действия (колесико, кнопки со стрелками, страницы/клавиши со стрелками) ограничены разделом, в котором находится курсор: вы не можете пройти дальше ЧЧ: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_())
person musicamante    schedule 01.07.2020

Вы можете использовать маску ввода.

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

Примечание

Ваша задача не полностью определена. Что произойдет, если формат будет нарушен? Перезаписать запись допустимой строкой? Ничего не делать? Отправить сообщение об ошибке? Формат уже нарушен, если введено время ›24h?

person Sven Krüger    schedule 30.06.2020
comment
я хочу, чтобы когда кто-то вводил букву или символ, он не изменялся! и если он ввел значение больше 24:00, оно автоматически становится 24:00 - person walid761; 30.06.2020