QDateEdit com o calendário sinais editingFinished() quando o calendário pop-up é clicado

0

Pergunta

Eu tenho um QDateEdit com o calendário habilitado e estou tentando capturar o fim da edição:

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

Se eu editar a data a partir do teclado, checkDate() é chamado quando o foco deixa o widget por tabulação, teclar enter, etc. Mas se eu clicar na seta para baixo que as forças de exibição do calendário, checkDate() é chamado imediatamente quando o calendário aparece, e novamente quando o elemento perde o foco. Eu não quero amarrar o userDateChanged vez que os sinais em cada pressionamento de tecla na caixa de edição.

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

Você pode salvar o widget de calendário a partir do QDateTime e verifique se que onde o foco mudou:

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 herda QDateTimeEdit, que por sua vez herda de QAbstractSpinBox, que tem o keyboardTracking propriedade (activado por predefinição):

Se o teclado de controle é desativado, a opção de não emitir o valueChanged() e textChanged() sinais durante a digitação. Emite os sinais mais tarde, quando a tecla enter é pressionada, quando o foco do teclado é perdida, ou quando outra opção é utilizada a funcionalidade, e.g. pressionando uma tecla de seta.

A seguir irá fornecer o que você precisa, sem verificar a sobreposição de foco:

    the_date.setKeyboardTracking(False)

Considere que, enquanto a sua solução pode estar correto, é sempre melhor verificar o popup dinamicamente:

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

graças, que é a peça-chave que eu estava ausente. Eu acho que eu preciso olhar mais para cima na cadeia de heranças
Llaves

respondeu, antes de o teste. QAbtractSpinBox não tem valueChanged() ou textChanged() sinais, para que eles não são herdados por QDateEdit. Os sinais que pertencem a QSpinBox
Llaves

@Llaves que a referência é apenas para explicar o comportamento do campo, ele funciona da mesma forma para os alterado sinais de QDateTimeEdit. A diferença é que ele tem um controle mais (pop-up) que podem desencadear a alterado sinais devido à alteração de foco, se a data foi alterada nesse meio tempo.
musicamante

Mordido pela cadeia de heranças, e pensando literalmente. Eu estava procurando valueChanged ou textChanged, Eu perdi dateChanged no QDateTimeEdit. Obrigado pela sua paciência.
Llaves

Em outros idiomas

Esta página está em outros idiomas

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