Реализовать сигнал userEdited для QDateTimeEdit? - PullRequest
1 голос
/ 22 сентября 2010

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 голосов
/ 23 сентября 2010

Поскольку я не совсем уверен в том, что вы пытаетесь сделать, я бы согласился с Эли Бендерским.Кроме того, если вы знаете, когда вы будете программно изменять QDateTimeEdit, установите флажок, который вы можете проверить в обработчике слота, который будет указывать на программное изменение, и очистите его, когда вы закончите.

0 голосов
/ 22 сентября 2010

Идиоматический способ достижения этого в Qt - это подкласс QDateTimeEdit и добавление необходимых вам функций.Я понимаю, что вы попробовали это и «не смогли справиться с событиями», но это отдельная проблема, и, возможно, вам следует описать эти проблемы - поскольку они должны быть решаемы.

...