QDateEdit avec calendrier des signaux editingFinished() lorsque le calendrier popup est cliqué

0

La question

J'ai un QDateEdit avec le calendrier activé et je suis en essayant de capturer la fin de l'édition:

the_date = QDateEdit(...)
<some more initialization>
the_date.setCalendarPopup(True)
the_date.editingFinished.connect(checkDate)
...
def checkDate():
  print ("checkDate called")

Si je modifier la date à partir du clavier, checkDate() est appelé lorsque le focus quitte le widget par la tabulation, le retour percutant, etc. Mais si je clique sur la flèche vers le bas que les forces de l'affichage du calendrier, checkDate() est appelée immédiatement lorsque le calendrier apparaît, et à nouveau lorsque le widget perd le focus. Je ne veux pas de cravate à la userDateChanged parce que les signaux sur chaque frappe de touche dans la zone d'édition.

pyqt5 python qdateedit
2021-11-23 23:38:16
2
0

Vous pouvez enregistrer le widget de calendrier à partir de la QDateTime et vérifier si c'est plutôt:

the_date = QDateEdit(...)
<some more initialization>
the_date.setCalendarPopup(True)
calendar = the_date.calendarWidget()
the_date.editingFinished.connect(checkDate)
...
def checkDate():
  if not calendar.hasFocus()
    # do whatever it was you wanted to do when QDateEdit finished editing
2021-11-23 23:38:16
0

QDateEdit hérite de QDateTimeEdit, qui hérite de QAbstractSpinBox, qui a la keyboardTracking la propriété enabled (activé, option par défaut):

Si le suivi de clavier est désactivé, la boîte n'émet pas de la valueChanged() et textChanged() des signaux lors de la frappe. Il émet des signaux plus tard, lorsque la touche entrée est pressée, lorsque le focus clavier est perdu, ou lorsque d'autres spinbox fonctionnalité est utilisée, par exemple, en appuyant sur une touche fléchée.

Le suivant sera de fournir ce dont vous avez besoin, sans contrôle de la popup se concentrer:

    the_date.setKeyboardTracking(False)

Considérer que, même si votre solution pourrait être correct, il est toujours préférable de vérifier pour la popup dynamiquement:

    if not the_date.calendarWidget().hasFocus():
        # ...
2021-11-24 00:14:48

merci, c'est l'élément clé qui me manquait. Je suppose que j'ai besoin de regarder plus haut dans la chaîne d'héritage
Llaves

répondu avant entièrement tests. QAbtractSpinBox ne soit pas valueChanged() ou textChanged() signaux, de sorte qu'ils ne sont pas héritées par QDateEdit. Ces signaux appartiennent à QSpinBox
Llaves

@Llaves que la référence est juste pour expliquer le comportement de la boîte, il fonctionne de la même manière pour le changement de signaux de QDateTimeEdit. La différence, c'est qu'il a un autre contrôle (popup) qui pourraient déclencher l'a changé en raison de signaux le changement de focus, si la date a changé entre-temps.
musicamante

Mordu de nouveau par la chaîne d'héritage, et de la pensée à pied de la lettre. Je cherchais valueChanged ou textChanged, Je l'ai raté dateChanged dans QDateTimeEdit. Merci pour votre patience.
Llaves

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................