QLineEdit
имеет сигнал textEdited
, который испускается всякий раз, когда текст изменяется в результате взаимодействия с пользователем, но не когда текст изменяется программно.Однако QDateTimeEdit
имеет только общий сигнал dateTimeChanged
, который не различает эти два типа изменений.Поскольку мое приложение зависит от знания, было ли поле отредактировано пользователем, я ищу способы его реализации.
Моя (в настоящее время работающая) стратегия заключалась в создании eventFilter
для поля редактирования.перехватить нажатия клавиш и события колеса мыши и использовать их, чтобы определить, было ли поле изменено пользователем (сохранить эту информацию в объекте), и, наконец, подключить сигнал dateTimeChanged
к функции, которая решает, было ли изменение выполнено пользователемили сделано программно.Вот соответствующие части кода (python):
class UserFilter(QObject):
def __init__(self, parent):
QObject.__init__(self, parent)
self.parent = parent
def eventFilter(self, object, event):
if event.type() == QEvent.KeyPress or event.type() == QEvent.Wheel:
self.parent.edited = True
else:
pass
return False
class DockThumb(QWidget):
def __init__(self, parent):
QWidget.__init__(self, parent)
self.parent = parent
self.edited = False
self.dateedit = QDateTimeEdit(self)
self.userfilter = UserFilter(self)
self.dateedit.installEventFilter(self.userfilter)
...
self.connect(self.dateedit,
SIGNAL('dateTimeChanged(QDateTime)'),
self.edited_or_not)
def edited_or_not(self):
if self.edited:
# User interacted! Go for it.
self.parent.runtimer()
# self.edited returns to False once data is saved.
else:
# User did not edited. Wait.
pass
Есть ли более объективный способ сделать это?Я попытался создать подкласс QDateTimeEdit
, но не смог справиться с событиями ... Ожидаемое взаимодействие с пользователем - прямая печать, клавиши со стрелками вверх / вниз для прокрутки дат и копирования / вставки всей строки.