【发布时间】:2010-09-22 04:37:56
【问题描述】:
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 进行子类化,但未能处理事件...预期的用户交互是直接键入、向上/向下箭头键旋转日期和复制/粘贴整个字符串。
【问题讨论】: