Я хочу указать QlineEdit, что он может вводить только такой часовой формат (24:00); поэтому он принимает только цифры, и его максимум составляет 24:00, где начальное значение равно 00:00, и когда я изменяю час, он автоматически сохраняет:. Спасибо.
Как ввести только часовой формат в QlineEdit
Ответы (3)
Комментарии, которые вы сделали после ответа Свена, показывают, что вам нужно гораздо более надежное и полное решение, чем вы изначально просили. Если вы хотите полностью настроить, какие символы можно/нельзя добавлять в LineEdit, и хотите запускать функции, которые проверяют входные данные, вам нужно изучить возможность использования QValidator.
Если вы не совсем уверены, что такое QValidator:
QValidator — это класс, обеспечивающий проверку вводимого текста. При его использовании вы подключаете его к QLineEdit, QSpinBox или QComboBox. Всякий раз, когда пользователь редактирует подключенное поле, после каждого введенного символа он запускает функцию
validate
, которую можно реализовать для запуска любой логики, необходимой для проверки ее правильности.
Эта ссылка показывает решение вашей проблемы с помощью QRegExpValidator. Однако, если вам по-прежнему требуется больше проверок, чем может обеспечить RegEx (или если вам неудобно использовать RegEx), вам потребуется создать подкласс QValidator и реализовать функцию validate
.
Возможным решением является использование 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_())
Вы можете использовать маску ввода.
qline = QLineEdit("00:00")
qline.setInputMask("HH:HH")
Примечание
Ваша задача не полностью определена. Что произойдет, если формат будет нарушен? Перезаписать запись допустимой строкой? Ничего не делать? Отправить сообщение об ошибке? Формат уже нарушен, если введено время ›24h?