Python PyQt5-QDateTimeEdit微调框滚动
我正在构建一个应用程序,从特定的FTP平台下载日志文件,我还希望用户能够在单独的QDateTimeEdit小部件中选择开始和停止日期。这将让程序选择适当的日志文件 当用户连接到平台时,会根据日志文件的可用性设置最小和最大Python PyQt5-QDateTimeEdit微调框滚动,python,pyqt5,python-3.6,qdatetime,Python,Pyqt5,Python 3.6,Qdatetime,我正在构建一个应用程序,从特定的FTP平台下载日志文件,我还希望用户能够在单独的QDateTimeEdit小部件中选择开始和停止日期。这将让程序选择适当的日志文件 当用户连接到平台时,会根据日志文件的可用性设置最小和最大datetimes,这可以正常工作,直到用户尝试从3月31日到4月1日使用spinbox按钮升级。小部件不会滚动到下个月 是否缺少启用或禁用滚动的属性 我是否可以插入自定义python(3.6)代码来创建滚动?我的谷歌搜索只得到了一个我读不太好的steppy 以下是.ui文件的X
datetime
s,这可以正常工作,直到用户尝试从3月31日到4月1日使用spinbox按钮升级。小部件不会滚动到下个月
是否缺少启用或禁用滚动的属性
我是否可以插入自定义python(3.6)代码来创建滚动?我的谷歌搜索只得到了一个我读不太好的steppy
以下是.ui文件的XML版本:
<widget class="QDateTimeEdit" name="timestart">
<property name="geometry">
<rect>
<x>510</x>
<y>155</y>
<width>126</width>
<height>22</height>
</rect>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="displayFormat">
<string notr="true">yyyy-MM-dd HH:mm:ss</string>
</property>
</widget>
<widget class="QDateTimeEdit" name="timeend">
<property name="geometry">
<rect>
<x>510</x>
<y>205</y>
<width>126</width>
<height>22</height>
</rect>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="displayFormat">
<string notr="true">yyyy-MM-dd HH:mm:ss</string>
</property>
</widget>
510
155
126
22
Qt::AlignRight | Qt::AlignTraining | Qt::AlignVCenter
yyyy MM dd HH:MM:ss
510
205
126
22
Qt::AlignRight | Qt::AlignTraining | Qt::AlignVCenter
yyyy MM dd HH:MM:ss
我意识到启用
calendarPopup
也是一种解决方法,但从设计角度来看,如果我能找到一种解决滚动问题的方法,我宁愿不要这样做。一个可能的解决方法是将QDateTimeEdit子类化,并覆盖两者(负责显示启用的上/下箭头,并允许实际的上/下步操作)然后,为了允许更改超出当前日期/月份/年份限制的日期
不幸的是,这无法解决在选择适当的月份之前无法键入“无效”日数的问题(例如:无法在2月键入31),但由于spinbox、光标和完成器之间的交互作用,实现这样的结果非常复杂
在下面的代码中,我实现了它,因此所有有效的日期/时间字段实际上都可以上下移动:月、日、小时、分钟和秒
class DateTimeFix(QtWidgets.QDateTimeEdit):
_overrideSteps = (
QtWidgets.QDateTimeEdit.MonthSection,
QtWidgets.QDateTimeEdit.DaySection,
QtWidgets.QDateTimeEdit.HourSection,
QtWidgets.QDateTimeEdit.MinuteSection,
QtWidgets.QDateTimeEdit.SecondSection,
)
def stepEnabled(self):
if self.currentSection() in self._overrideSteps:
return self.StepUpEnabled | self.StepDownEnabled
return super().stepEnabled()
def stepBy(self, steps):
section = self.currentSection()
if section not in self._overrideSteps:
super().stepBy(steps)
return
dt = self.dateTime()
section = self.currentSection()
if section == self.MonthSection:
dt = dt.addMonths(steps)
elif section == self.DaySection:
dt = dt.addDays(steps)
elif section == self.HourSection:
dt = dt.addSecs(3600 * steps)
elif section == self.MinuteSection:
dt = dt.addSecs(60 * steps)
else:
dt = dt.addSecs(steps)
self.setDateTime(dt)
由于您在Designer中创建UI,因此需要在Designer中升级QDateTimeEdit以使用上述类。简化的过程是:右键单击designer中的QDateTimeEdit小部件,并从“升级的类名”字段中的对话框类型“DateTimeix”(类名)中选择“升级到…”,然后键入将放置上述类的文件名(不带
.py
扩展,就像导入一样),确保基类名称仍然正确(QDateTimeEdit),单击“添加”,然后单击“升级”。完成此过程后,您可以升级该ui中可能具有的所有其他QDateTimeEdit(只需右键单击它们并从新的“升级到”中选择它)子菜单)。请参阅以获得更详细的解释。感谢您的快速响应!我所有的代码都在类Ui(qtwidts.QMainWindow)中:
总体而言,我对类没有做过太多的工作。我尝试将您的代码放在该类的范围内和之上,但在运行时仍然无法滚动。我是否做错了什么,或者需要进行任何自定义以使其适合我的代码?因为如果是这样,我看不到它。对不起,我忘记了您已经安装了重新使用在Designer中创建的文件。请参阅更新。它可以工作!我现在还不确定它是如何工作的,但我会仔细阅读并从中学习。谢谢!@Chokehold在实践中,stepabled
是调用的主要函数,用于显示哪些箭头应该被绘制为已启用,以及(最重要的是)如果旋转实际上可以向上或向下,那么这就是要实现的第一步(双关语)。然后,每当键盘导航(箭头/页面键)时,就会调用stepBy
当单击箭头或使用鼠标滚轮时使用。在QDateTimeEdit中,它通过检测文本光标所在的当前节并相应更改该节来工作,但默认实现阻止移动到当前字段“范围”之外。