实现userEdited信号到QDateTimeEdit?

时间:2010-09-22 04:37:56

标签: python qt pyqt4 signals

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,但未能处理事件...预期的用户交互是直接输入,上/下箭头键来旋转日期并复制/粘贴整个字符串。

2 个答案:

答案 0 :(得分:0)

实现此目的的惯用Qt方式确实是对QDateTimeEdit进行子类化并添加您需要的功能。我知道你尝试过并“未能处理事件”,但这是一个单独的问题,也许你应该描述这些问题 - 因为它们应该是可以解决的。

答案 1 :(得分:0)

由于我不完全确定你要做什么,我会同意Eli Bendersky。如果您知道何时以编程方式更改QDateTimeEdit,请设置一些标记,您可以在插槽处理程序中检查该标记,指示正在进行编程更改并在完成后将其清除。