Python PyQt5-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

我正在构建一个应用程序,从特定的FTP平台下载日志文件,我还希望用户能够在单独的QDateTimeEdit小部件中选择开始和停止日期。这将让程序选择适当的日志文件

当用户连接到平台时,会根据日志文件的可用性设置最小和最大
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中,它通过检测文本光标所在的当前节并相应更改该节来工作,但默认实现阻止移动到当前字段“范围”之外。