pyqt dateEdit最大值

时间:2018-11-23 16:07:52

标签: python datepicker pyqt5

我已经使用pyqt设计器创建了一个UI,该UI具有2个dateEdit小部件,这些小部件用于指定时间窗口。两者都设置为弹出日历,以使用户生活更轻松。我想确保您永远无法获得“开始”大于“结束”的时间窗口。

示例的开始和结束是dateEdit小部件:

start.value = 20181010

end.value = 20181011

用户选择开始窗口小部件,弹出日历,然后用户可以选择20181012,这将导致start.value> end.value,这在我的应用程序中是毫无意义的。

我需要能够确保不会发生这种情况。

我有多种方法可以解决该问题,但是每种方法都需要我临时劫持回调,例如ComboBox的ComboBox.currentIndexChanged。我找不到与dateEdit类似的功能。

我面临的问题是将开始日期设置为始终小于或等于结束日期。我很高兴始终确定结束日期,因此我只需要限制dateEdit之一。 问题是唯一的“ Max”约束是静态约束,因此我需要劫持触发日历打开的回调,以便我可以插入读取另一个dateEdit小部件并将其值设置为max的代码。当前版本。

有关如何进行劫持的任何线索? 替代计划也被广泛接受。

1 个答案:

答案 0 :(得分:1)

您必须使用dateChanged信号来更新maximunDate或minimumDate,并根据情况添加适当的偏移量:

from PyQt5 import QtCore, QtWidgets

class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)

        self.date_from = QtWidgets.QDateEdit()
        self.date_to = QtWidgets.QDateEdit()
        for w in (self.date_from, self.date_to, ):
            w.setDisplayFormat("yyyyMMdd")
            w.setCalendarPopup(True)
        self.setup_date()

        lay = QtWidgets.QHBoxLayout(self)
        lay.addWidget(self.date_from)
        lay.addWidget(self.date_to)

    def setup_date(self):
        self.date_from.dateChanged.connect(self.on_date_from_changed)
        self.date_to.dateChanged.connect(self.on_date_to_changed)
        self.date_from.setDate(QtCore.QDate(2018, 10, 10))
        self.date_to.setDate(QtCore.QDate(2018, 10, 11))

    @QtCore.pyqtSlot(QtCore.QDate)
    def on_date_from_changed(self, date):
        self.date_to.setMinimumDate(date.addDays(1))

    @QtCore.pyqtSlot(QtCore.QDate)
    def on_date_to_changed(self, date):
        self.date_from.setMaximumDate(date.addDays(-1))

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())