如何将日期选择从日历小部件传输到 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_clickedupdate_date_selection_text