我已经使用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的代码。当前版本。
有关如何进行劫持的任何线索? 替代计划也被广泛接受。
答案 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_())