如何将日期选择从日历小部件传输到 QLineEdit
How to transfer date selection from calendar widget to QLineEdit
我正在玩 PyQt5(我昨天才开始学习)。
我正在尝试创建一个 window/layout,带有两个输入框(用于输入 'start' 和 'end' 日期),以便在单击每个输入框时,QCalendarWidget
被触发弹出,当用户选择日期时,日期被输入到 QLineEdit
字段中。
到目前为止,它只显示空白 window,但我不确定我做错了什么。
class selectedDate(QWidget):
def __init__(self):
super(selectedDate, self).__init__()
self.layout = QVBoxLayout(self)
self.selection = QLineEdit("Click to Enter Date", self)
self.layout.addWidget(self.selection)
self.layout.addWidget(self.selection)
self.selection.installEventFilter(self)
def mousePressEvent(self, e):
self.myCal()
super(selectedDate, self).mousePressEvent(e)
def eventFilter(self, object, e):
if self.layout.indexOf(object) != -1:
if e.type() == e.MouseButtonPress:
pass
return super(selectedDate, self).eventFilter(object, e)
def myCal(self):
self.cal = QCalendarWidget(self)
self.cal.setGridVisible(True)
self.cal.move(10, 20)
self.cal.clicked[QDate].connect(self.showDate)
self.date = self.cal.selectedDate()
self.selection.setText(self.date.toString())
self.setGeometry(300, 300, 415, 350)
self.setWindowTitle('Calendar')
self.show()
def showDate(self, date):
self.selection.setText(date.toString())
app = QApplication(sys.argv)
top = selectedDate()
app.exec_()
问题比较多,我们一起解决吧。
要查看 window,您需要致电 QWidget.show()
。这里你只调用 self.show()
中的 myCal
方法。但是 myCal
只能通过单击鼠标来调用。您肯定希望在启动应用程序后立即显示 window。为此,您只需将 self.show()
放在 __init__
方法的末尾即可。
class SelectedDate(QWidget):
def __init__(self):
# layout stuff, QLineEdit, etc
self.show() # show your first window with the QLineEdit
接下来,鼠标按下事件。 mousePressEvent
方法实际上从未被调用过!您可以通过在其中添加打印语句来检查。
它应该在检测到 MouseButtonPress
时调用(在 eventFilter
中)
最后是日历小部件。我们想在新的window中打开(QCalendarWidget
默认不会弹出,需要自己打开)。
def myCal(self):
self.cal = QCalendarWidget(self)
self.cal.setGridVisible(True)
self.cal.clicked[QDate].connect(self.showDate)
# create a new window that contains the calendar
self.calendarWindow = QWidget()
hbox = QHBoxLayout()
hbox.addWidget(self.cal)
self.calendarWindow.setLayout(hbox)
self.calendarWindow.setGeometry(300, 300, 415, 350)
self.calendarWindow.setWindowTitle('Calendar')
# open this new window
self.calendarWindow.show()
现在再提供一些建议。您应该从一个简单的应用程序开始,然后在它运行时构建更多功能。为一片空白写很多代码 window 这不是个好主意!因此,如果您在哪里再次执行此操作,请按步骤操作:
- 显示 window 和
QLineEdit
(编写代码,测试它是否有效)
- 实施事件过滤器(使用打印语句查看是否有效)
- 实现在点击
QLineEdit
时打开一个新空白 window
- 用日历
填空window
- 将日历连接到
QLineEdit
文本(顺便说一下,该代码很好)
另外,你可以使用更好的变量名,一些建议:
selectedDate
-> SelectDateWidget
selection
-> date_selection
mousePressEvent
-> on_date_selection_clicked
myCal
-> open_calendar
cal
-> calendar
showDate
-> on_calendar_clicked
或 update_date_selection_text
我正在玩 PyQt5(我昨天才开始学习)。
我正在尝试创建一个 window/layout,带有两个输入框(用于输入 'start' 和 'end' 日期),以便在单击每个输入框时,QCalendarWidget
被触发弹出,当用户选择日期时,日期被输入到 QLineEdit
字段中。
到目前为止,它只显示空白 window,但我不确定我做错了什么。
class selectedDate(QWidget):
def __init__(self):
super(selectedDate, self).__init__()
self.layout = QVBoxLayout(self)
self.selection = QLineEdit("Click to Enter Date", self)
self.layout.addWidget(self.selection)
self.layout.addWidget(self.selection)
self.selection.installEventFilter(self)
def mousePressEvent(self, e):
self.myCal()
super(selectedDate, self).mousePressEvent(e)
def eventFilter(self, object, e):
if self.layout.indexOf(object) != -1:
if e.type() == e.MouseButtonPress:
pass
return super(selectedDate, self).eventFilter(object, e)
def myCal(self):
self.cal = QCalendarWidget(self)
self.cal.setGridVisible(True)
self.cal.move(10, 20)
self.cal.clicked[QDate].connect(self.showDate)
self.date = self.cal.selectedDate()
self.selection.setText(self.date.toString())
self.setGeometry(300, 300, 415, 350)
self.setWindowTitle('Calendar')
self.show()
def showDate(self, date):
self.selection.setText(date.toString())
app = QApplication(sys.argv)
top = selectedDate()
app.exec_()
问题比较多,我们一起解决吧。
要查看 window,您需要致电 QWidget.show()
。这里你只调用 self.show()
中的 myCal
方法。但是 myCal
只能通过单击鼠标来调用。您肯定希望在启动应用程序后立即显示 window。为此,您只需将 self.show()
放在 __init__
方法的末尾即可。
class SelectedDate(QWidget):
def __init__(self):
# layout stuff, QLineEdit, etc
self.show() # show your first window with the QLineEdit
接下来,鼠标按下事件。 mousePressEvent
方法实际上从未被调用过!您可以通过在其中添加打印语句来检查。
它应该在检测到 MouseButtonPress
时调用(在 eventFilter
中)
最后是日历小部件。我们想在新的window中打开(QCalendarWidget
默认不会弹出,需要自己打开)。
def myCal(self):
self.cal = QCalendarWidget(self)
self.cal.setGridVisible(True)
self.cal.clicked[QDate].connect(self.showDate)
# create a new window that contains the calendar
self.calendarWindow = QWidget()
hbox = QHBoxLayout()
hbox.addWidget(self.cal)
self.calendarWindow.setLayout(hbox)
self.calendarWindow.setGeometry(300, 300, 415, 350)
self.calendarWindow.setWindowTitle('Calendar')
# open this new window
self.calendarWindow.show()
现在再提供一些建议。您应该从一个简单的应用程序开始,然后在它运行时构建更多功能。为一片空白写很多代码 window 这不是个好主意!因此,如果您在哪里再次执行此操作,请按步骤操作:
- 显示 window 和
QLineEdit
(编写代码,测试它是否有效) - 实施事件过滤器(使用打印语句查看是否有效)
- 实现在点击
QLineEdit
时打开一个新空白 window
- 用日历 填空window
- 将日历连接到
QLineEdit
文本(顺便说一下,该代码很好)
另外,你可以使用更好的变量名,一些建议:
selectedDate
->SelectDateWidget
selection
->date_selection
mousePressEvent
->on_date_selection_clicked
myCal
->open_calendar
cal
->calendar
showDate
->on_calendar_clicked
或update_date_selection_text