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_())

введите сюда описание изображения

введите сюда описание изображения

→ Ссылка