1


0

QDateTimeEditにuserEditedシグナルを実装しますか?

https://doc.qt.io/archives/qt-4.8/qlineedit.html [QLineEdit]には、テキストがプログラムで変更されたときではなく、ユーザーの操作によってテキストが変更されたときに発行される` textEdited`シグナルがあります。 しかし、 QDateTimeEdit`には、これら2つのタイプの変更を区別しない一般的な 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


これを実現するQtの慣用的な方法は、実際に `QDateTimeEdit`をサブクラス化し、必要な機能を追加することです。 私はあなたがそれを試みて「イベントに対処できなかった」ことを理解していますが、それは別の問題であり、おそらくあなたはそれらの問題を解決できるはずなので、それらの問題を説明する必要があります。


0


あなたが何をしようとしているのか完全にはわからないので、Eli Benderskyに同意します。 それ以外では、プログラムで `QDateTimeEdit`をいつ変更するかがわかっている場合は、プログラムの変更が発生していることを示すスロットハンドラーでチェックできるフラグを設定し、完了したらクリアします。