QTimeEdit没有弹出窗口,它的整体设计使它"不好用".
因此,我编写了两个自定义的QWidget类:
-
class Clock_hourWidget(QWidget):
class/object返回/发出第一个有效小时输入 -
class Clock_minuteWidget(QWidget):
class/object返回/发出第一个有效分钟输入
我把它们嵌入到一个自定义的QTimeEdit中:
import math
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QTimeEdit, QApplication
from PyQt5.QtCore import QTime, Qt, QTimer
from PyQt5.QtGui import QIcon
class Clock_hourWidget(QtWidgets.QWidget):
return_hour = 15
first = True
def __init__(self, hours, callback, parent=None):
super(Clock_hourWidget, self).__init__(parent)
self.setWindowFlags(Qt.Popup)
self.callback = callback
self.setFixedSize(150,150)
self.hours = hours
def mousePressEvent(self, event):
if self.rect().contains(event.localPos().toPoint()):
self.first = False
self.return_hour = self.hours
self.close()
@property
def hour(self):
if self.first:
result = -1
else:
result = self.return_hour
return result
def closeEvent(self, event):
self.callback(self.hour)
event.accept()
class Clock_minuteWidget(QtWidgets.QWidget):
return_minutes = 30
def __init__(self, minutes, callback, parent=None):
super(Clock_minuteWidget, self).__init__(parent)
self.setWindowFlags(Qt.Popup)
self.setFixedSize(150,150)
self.callback = callback
self.minutes = minutes
def mousePressEvent(self, event):
if self.rect().contains(event.localPos().toPoint()):
self.return_minutes = self.minutes
self.close()
@property
def minute(self):
return self.return_minutes
def closeEvent(self, event):
self.callback(self.minute)
event.accept()
class CustomTimeEdit(QTimeEdit):
def __init__(self, parent=None):
super(CustomTimeEdit, self).__init__(parent)
self.setDisplayFormat("HH:mm")
self.setCalendarPopup(False)
# calendar_icon = QIcon.fromTheme("calendar")
# self.setButtonSymbols(calendar_icon)
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
self.open_clock_hourwidget()
def return_hour(self, hour):
self.clock_hourwidget = None
if hour != -1:
self.hours = hour
self.minutes = self.time().minute()
self.setTime(QTime(self.hours, self.minutes))
self.clock_minutewidget = Clock_minuteWidget(self.minutes, self.clock_finalizer)
pos = self.mapToGlobal(self.rect().bottomLeft())
pos = self.adjust_Popup_positioning(pos, self.clock_minutewidget)
self.clock_minutewidget.move(pos)
self.clock_minutewidget.show()
def open_clock_hourwidget(self):
self.hours = self.time().hour()
self.clock_hourwidget = Clock_hourWidget(self.hours, self.return_hour)
pos = self.mapToGlobal(self.rect().bottomLeft())
pos = self.adjust_Popup_positioning(pos, self.clock_hourwidget)
self.clock_hourwidget.move(pos)
self.clock_hourwidget.show()
def adjust_Popup_positioning(self, pos, widget):
screen = QApplication.desktop().screenNumber(QApplication.desktop().cursor().pos())
screen_geometry = QApplication.desktop().screenGeometry(screen)
if pos.y() + widget.height() > screen_geometry.height():
pos = self.mapToGlobal(self.rect().topLeft())
pos.setY(pos.y() - widget.height())
if pos.x() < screen_geometry.left():
pos.setX(screen_geometry.left())
elif pos.x() + widget.width() > screen_geometry.right():
pos.setX(screen_geometry.right() - widget.width())
return pos
def clock_finalizer(self, minute):
self.clock_minutewidget = None
self.setTime(QTime(self.hours, minute))
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
time_edit = CustomTimeEdit()
time_edit.show()
sys.exit(app.exec_())
我希望弹出窗口的行为像QDateEdit的CalendarPopup(已经在上面的代码片段中删除了功能):
弹出窗口应在自定义QTimeEdit下打开如果自定义QTimeEdit下的空间不足,则应显示在自定义QTimeEdit上方如果右边没有足够的空间,它应该稍微向左移动,反之亦然最重要的是,似乎是不可撤销的:如果用户点击弹出窗口外,或者如果弹出窗口(可能是整个应用程序)失go 焦点(通过按下windows键或alt—tab,例如):弹出窗口关闭.- 自定义QTimeEdit的按钮外观和行为应该像QDateEdit/QDateTimeEdit(
setCalendarPopup(True)
)的CalendarPopup按钮:外观应该根据使用的样式和平台而改变
如果需要的话,我可以提供完整的代码,但出于简单的原因,我试图尽可能地削减它.