QDateEdit con el calendario de las señales de editingFinished() cuando el menú emergente de calendario de que se hace clic

0

Pregunta

Tengo un QDateEdit con el calendario habilitado y estoy tratando de capturar la final de la edición:

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

Si puedo editar la fecha desde el teclado, checkDate() se llama cuando el foco sale el widget de la tabulación de pulsar intro, etc. Pero si hago clic en la flecha hacia abajo que las fuerzas de la pantalla del calendario, checkDate() se llama inmediatamente cuando el calendario aparece, y de nuevo cuando el control pierde el foco. No quiero atar a la userDateChanged debido a que las señales en cada pulsación de tecla en el cuadro de edición.

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

Puede guardar el widget de calendario a partir de la QDateTime y comprobar si el foco desplazado:

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 hereda de QDateTimeEdit, que a su vez hereda de QAbstractSpinBox, que tiene la keyboardTracking propiedad (habilitado por defecto):

Si el teclado de seguimiento está deshabilitada, la caja de hilatura no emite el valueChanged() y textChanged() señales mientras se escribe. Emite las señales más tarde, cuando el retorno se pulsa la tecla, cuando el foco del teclado se pierde, o cuando otros spinbox funcionalidad se utiliza, por ejemplo, la pulsación de una tecla de flecha.

El siguiente va a proporcionar lo que necesita, sin comprobar en la ventana de enfoque:

    the_date.setKeyboardTracking(False)

Tenga en cuenta que aunque la solución podría estar en lo correcto, siempre es mejor comprobar el popup de forma dinámica:

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

gracias, esa es la clave de la pieza que me faltaba. Creo que es necesario mirar más allá, hasta la cadena de la herencia
Llaves

respondió antes de la prueba. QAbtractSpinBox no tiene valueChanged() o textChanged() las señales, por lo que no son heredados por QDateEdit. Esas señales pertenecen a QSpinBox
Llaves

@Llaves que la referencia es sólo para explicar el comportamiento de la caja de hilatura, funciona de la misma manera para que los cambios en las señales de QDateTimeEdit. La diferencia es que tiene un control (popup) que podría provocar el cambio de las señales debido a que el cambio de foco, si la fecha ha cambiado en el ínterin.
musicamante

Mordido de nuevo por la cadena de la herencia, y el pensamiento, literalmente. Yo estaba buscando valueChanged o textChanged, Echaba de menos dateChanged en QDateTimeEdit. Gracias por su paciencia.
Llaves

En otros idiomas

Esta página está en otros idiomas

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