QDateEdit с редактированием сигналов календаря завершено() при нажатии всплывающего окна календаря

0

Вопрос

У меня есть QDateEdit с включенным календарем и я пытаюсь запечатлеть конец редактирования:

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

Если я отредактирую дату с клавиатуры, checkDate() вызывается, когда фокус покидает виджет с помощью вкладки, нажатия кнопки возврата и т. Д. Но если я нажму на стрелку вниз, которая ускорит отображение календаря, checkDate() вызывается немедленно при появлении календаря и снова, когда виджет теряет фокус. Я не хочу привязываться к userDateChanged, потому что это сигнализирует о каждом нажатии клавиши в окне редактирования.

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

Вы можете сохранить виджет календаря из QDateTime и проверить, не сместился ли фокус именно туда:

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 наследуется от QDateTimeEdit, который, в свою очередь, наследуется от QAbstractSpinBox, который имеетkeyboardTracking свойство (включено по умолчанию):

Если отслеживание клавиатуры отключено, спин-бокс не выдает сигналы valueChanged() и TextChanged() при вводе текста. Он выдает сигналы позже, при нажатии клавиши возврата, при потере фокуса клавиатуры или при использовании других функций spinbox, например, при нажатии клавиши со стрелкой.

Ниже приведено то, что вам нужно, без проверки фокуса всплывающего окна:

    the_date.setKeyboardTracking(False)

Учтите, что, хотя ваше решение может быть правильным, всегда лучше проверять наличие всплывающего окна динамически:

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

спасибо, это то, чего мне не хватало. Я думаю, мне нужно посмотреть дальше по цепочке наследования
Llaves

ответил до полного тестирования. QAbtractSpinBox не имеет ни того, ни другого valueChanged() или textChanged() сигналы, поэтому они не наследуются QDateEdit. Эти сигналы принадлежат QSpinBox
Llaves

@Llaves эта ссылка предназначена только для объяснения поведения спин-бокса, она работает точно так же для измененных сигналов QDateTimeEdit. Разница в том, что у него есть дополнительный элемент управления (всплывающее окно), который может вызвать измененные сигналы из-за изменения фокуса, если за это время дата изменилась.
musicamante

Снова укушенный цепочкой наследования и думающий буквально. Я искал valueChanged или textChanged, Я пропустил dateChanged в QDateTimeEdit. Спасибо за ваше терпение.
Llaves

На других языках

Эта страница на других языках

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