QDateEdit con calendario segnali editingFinished() quando il calendario popup è cliccato

0

Domanda

Ho un QDateEdit con il calendario attivato e sto cercando di catturare la fine di modifica:

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

Se modifico la data dalla tastiera, checkDate() viene chiamato quando la messa a fuoco lascia il widget da tabulazione, premendo invio, etc. Ma se faccio clic sulla freccia in giù che le forze di visualizzazione del calendario, checkDate() viene chiamato immediatamente quando il calendario viene visualizzato, e di nuovo quando il widget si perde la messa a fuoco. Non voglio legare al userDateChanged perché i segnali su ogni battitura nella casella di modifica.

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

È possibile salvare il widget del calendario dal QDateTime e verificare se dove l'attenzione si è spostata:

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 eredita da QDateTimeEdit, che a sua volta eredita da QAbstractSpinBox, che ha il keyboardTracking proprietà (attivata per impostazione predefinita):

Se la tastiera rilevamento è disattivato, il quadrante non emette il valueChanged() e textChanged() segnali durante la digitazione. Emette i segnali più tardi, quando il ritorno viene premuto un tasto della tastiera si perde il focus, o quando altre quadrante funzionalità è utilizzata, ad esempio, si preme un tasto freccia.

Di seguito vi forniamo di che cosa avete bisogno, senza controllare la comparsa di messa a fuoco:

    the_date.setKeyboardTracking(False)

Considerare che mentre la tua potrebbe essere la soluzione più corretta, è sempre meglio controllare per il popup in modo dinamico:

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

grazie, questo è il pezzo che mi mancava. Credo che ho bisogno di guardare più lontano la catena di ereditarietà
Llaves

rispose prima di un test completo. QAbtractSpinBox non hanno valueChanged() o textChanged() i segnali, in modo che non vengono ereditate da QDateEdit. Questi segnali appartengono a QSpinBox
Llaves

@Llaves che il riferimento è solo per spiegare il comportamento del quadrante, funziona allo stesso modo per l'cambiato segnali di QDateTimeEdit. La differenza è che ha un ulteriore controllo (popup) che potrebbero innescare l'cambiato segnali per la messa a fuoco cambia, se la data è stata cambiata nel frattempo.
musicamante

Morso di nuovo la catena di ereditarietà, e pensare letteralmente. Stavo cercando valueChanged o textChangedHo perso dateChanged in QDateTimeEdit. Grazie per la vostra pazienza.
Llaves

In altre lingue

Questa pagina è in altre lingue

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