【问题标题】:QDateEdit with calendar signals editingFinished() when calendar popup is clicked单击日历弹出窗口时,带有日历信号的 QDateEdit 编辑完成()
【发布时间】:2021-11-23 23:38:16
【问题描述】:

我有一个启用日历的 QDateEdit,并试图捕捉编辑的结束:

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

如果我从键盘编辑日期,当焦点通过 Tab、回车等离开小部件时,会调用 checkDate()。但如果我点击强制显示日历的向下箭头,则会调用 checkDate()当日历出现时立即,当小部件失去焦点时再次。 我不想与 userDateChanged 绑定,因为它会在编辑框中的每次击键时发出信号。

【问题讨论】:

    标签: python pyqt5 qdateedit


    【解决方案1】:

    您可以从 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
    

    【讨论】:

      【解决方案2】:

      QDateEdit 继承自 QDateTimeEdit,后者又继承自 QAbstractSpinBox,后者具有 keyboardTracking 属性(默认启用):

      如果禁用键盘跟踪,则微调框在键入时不会发出 valueChanged() 和 textChanged() 信号。它稍后会在按下返回键、键盘焦点丢失或使用其他 spinbox 功能时发出信号,例如按箭头键。

      以下将提供您需要的内容,无需检查弹出焦点:

          the_date.setKeyboardTracking(False)
      

      请考虑,虽然您的解决方案可能是正确的,但最好动态检查弹出窗口:

          if not the_date.calendarWidget().hasFocus():
              # ...
      

      【讨论】:

      • 谢谢,这是我遗漏的关键部分。我想我需要更深入地查看继承链
      • 在全面测试前回复。 QAbtractSpinBox 既没有valueChanged() 也没有textChanged() 信号,所以它们不会被QDateEdit 继承。这些信号属于QSpinBox
      • @Llaves 该引用只是为了解释旋转框的行为,它对 QDateTimeEdit 的更改信号的工作方式相同。不同之处在于它有一个进一步的控件(弹出窗口),可能会触发由于焦点变化而发生变化的信号,如果同时日期发生了变化。
      • 又被继承链咬了一口,想从字面上看。我正在寻找valueChangedtextChanged,我在QDateTimeEdit 中错过了dateChanged。感谢您的耐心等待。
      猜你喜欢
      • 2011-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多