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
,但未能处理事件...预期的用户交互是直接输入,上/下箭头键来旋转日期并复制/粘贴整个字符串。
答案 0 :(得分:0)
实现此目的的惯用Qt方式确实是对QDateTimeEdit
进行子类化并添加您需要的功能。我知道你尝试过并“未能处理事件”,但这是一个单独的问题,也许你应该描述这些问题 - 因为它们应该是可以解决的。
答案 1 :(得分:0)
由于我不完全确定你要做什么,我会同意Eli Bendersky。如果您知道何时以编程方式更改QDateTimeEdit
,请设置一些标记,您可以在插槽处理程序中检查该标记,指示正在进行编程更改并在完成后将其清除。