QDateTimeEdit, как установить пустое значение после редактирования
Подскажите пожалуйста, как установить пустое значение в виджете QDateTimeEdit после окончания редактирования?
У меня есть кнопка для очистки значения QDateTimeEdit, но когда я выхожу из виджета, т.е. главное окно теряет фокус, то значение устанавливается на minDate.
import sys
from PyQt5 import QtCore, QtWidgets
from datetime import datetime
class DateEdit(QtWidgets.QDateTimeEdit):
def __init__(self, parent=None):
super(DateEdit,self).__init__(parent, calendarPopup=True)
self.calendarWidget().setGridVisible(True)
self.calendarWidget().setFixedSize(210,210)
self.calendarWidget().parentWidget().adjustSize()
self._today_button = QtWidgets.QPushButton(self.tr("Today"))
self._today_button.clicked.connect(self._update_today)
self._clear_button = QtWidgets.QPushButton(self.tr("Clear"))
self._clear_button.clicked.connect(self._clear_date)
self.calendarWidget().layout().addWidget(self._today_button)
self.calendarWidget().layout().addWidget(self._clear_button)
@QtCore.pyqtSlot()
def str_date_time(self, date_time_str):
try:
date_time_obj = datetime.datetime.strptime(date_time_str, '%d-%m-%Y %H:%M:%S')
#print (f"{date_time_obj} --- {type(date_time_obj)}")
dateTimeEdit = DateEdit(date_time_obj)
dateTimeEdit.setDisplayFormat("yyyy-MM-dd HH:mm:ss")
except Exception as e:
dateTimeEdit = DateEdit()
QtCore.QTimer.singleShot(10, lambda: self.linEdit().setText(''))
@QtCore.pyqtSlot()
def _update_today(self):
self._today_button.setFocus()
today = QtCore.QDate.currentDate()
self.calendarWidget().setSelectedDate(today)
@QtCore.pyqtSlot()
def _clear_date(self):
self._clear_button.setFocus()
self.lineEdit().setText('')
return self
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
w = DateEdit()
w.show()
sys.exit(app.exec_())
Ответы (2 шт):
Автор решения: el Kryack
→ Ссылка
Нашел вот такое решение, может кому-то будет полезно:
import sys
from PyQt5 import QtCore, QtWidgets, QtGui
from datetime import datetime
from typing import Tuple
class DateEdit(QtWidgets.QDateTimeEdit):
def __init__(self, parent=None):
super(DateEdit,self).__init__(parent, calendarPopup=True)
self.setDisplayFormat("yyyy-MM-dd HH:mm:ss")
#self.lineEdit().clear()
self.lineEdit().setReadOnly(True)
self.calendarWidget().setGridVisible(True)
self.calendarWidget().setFixedSize(210,210)
self.calendarWidget().parentWidget().adjustSize()
self._today_button = QtWidgets.QPushButton(self.tr("Today"))
self._today_button.clicked.connect(self._update_today)
self._clear_button = QtWidgets.QPushButton(self.tr("Clear"))
self._clear_button.clicked.connect(self._clear_date)
self.calendarWidget().layout().addWidget(self._today_button)
self.calendarWidget().layout().addWidget(self._clear_button)
self.calendarWidget().clicked.connect(self._clicked_date)
#print(str(self.dateTime())) #PyQt5.QtCore.QDateTime(2000, 1, 1, 0, 0)
def validate(self, input: str, pos: int) -> Tuple[QtGui.QValidator.State, str, int]:
# Определите, является ли ввод QDateTimeEdit допустимым, если он недействителен, он не будет вводиться в QDateTimeEdit.
# Возвращаемое значение QValidator.State имеет три состояния:
# QValidator.Acceptable: разрешить;
# QValidator.Intermediate: невозможно определить (т.е. промежуточное значение);
# QValidator.Invalid: Отказано.
# str: возвращает текст, который должно отображаться в поле ввода (не окончательный текст), значение по умолчанию — input;
# int: возвращает смещение курсора поля ввода, по умолчанию pos.
#print(self.objectName()+' input: '+input)
# '2000-01-01 00:00:00'
if not input:
return QtGui.QValidator.Intermediate, '-', 0
return super().validate(input, pos)
#Эта функция вызывается всякий раз, когда необходимо отобразить дату и время, возвращая то, что окончательно отображается в поле ввода.
def textFromDateTime(self, dateTime: QtCore.QDateTime) -> str:
return super().textFromDateTime(dateTime) if self.text() !='-' else ''
def str_date_time(self, date_time_str):
try:
date_time_obj = datetime.strptime(date_time_str, '%Y-%m-%d %H:%M:%S')
#print (f"{date_time_obj} --- {type(date_time_obj)}")
self.setDate(date_time_obj)
self.setDisplayFormat("yyyy-MM-dd HH:mm:ss")
except Exception as e:
QtCore.QTimer.singleShot(10, lambda: self.lineEdit().setText(''))
def _clicked_date(self):
self.setDisplayFormat("yyyy-MM-dd HH:mm:ss")
self.lineEdit().setText(self.calendarWidget().selectedDate().toString())
def _update_today(self):
self._today_button.setFocus()
self.setDisplayFormat("yyyy-MM-dd HH:mm:ss")
today = QtCore.QDate.currentDate()
self.setDate(today)
self.lineEdit().setText(today.toString())
self.calendarWidget().setSelectedDate(today)
def _clear_date(self):
self._clear_button.setFocus()
self.lineEdit().setText('')
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
w = DateEdit()
w.show()
sys.exit(app.exec_())
Автор решения: S. Nick
→ Ссылка
Как вариант. Проверьте все ли так.
import sys
from PyQt5 import QtCore, QtWidgets
from datetime import datetime
class DateEdit(QtWidgets.QDateTimeEdit):
def __init__(self, parent=None):
super(DateEdit,self).__init__(parent, calendarPopup=True)
self.calendarWidget().setGridVisible(True)
self.calendarWidget().setFixedSize(210, 210)
self.calendarWidget().parentWidget().adjustSize()
self._today_button = QtWidgets.QPushButton(self.tr("Today"))
self._today_button.clicked.connect(self._update_today)
self._clear_button = QtWidgets.QPushButton(self.tr("Clear"))
self._clear_button.clicked.connect(self._clear_date)
self.calendarWidget().layout().addWidget(self._today_button)
self.calendarWidget().layout().addWidget(self._clear_button)
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
self.dateTimeChanged.connect(self.changed_datetime) # !!! +++
self.flag = True # !!! +++
self.setFocus()
app.focusChanged.connect(self.onFocusChanged) # !!! +++
def changed_datetime(self, datetime):
self.flag = False
def onFocusChanged(self):
dateTime = self.dateTime().toString('yyyy-MM-dd HH:mm:ss')
if self.isActiveWindow() and not self.lineEdit().text():
dateTime = '2000-01-01 00:00:00'
if self.flag:
self._clear_date()
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@QtCore.pyqtSlot()
def _update_today(self):
self._today_button.setFocus()
today = QtCore.QDate.currentDate()
self.calendarWidget().setSelectedDate(today)
self.flag = False
@QtCore.pyqtSlot()
def _clear_date(self):
self._clear_button.setFocus()
self.lineEdit().setText('')
self.flag = True
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
w = DateEdit()
w.show()
sys.exit(app.exec_())

