如何将日期选择从日历窗口小部件传输到QLineEdit

时间:2018-01-10 08:28:39

标签: python python-3.x pyqt5 qcalendarwidget

我正在玩PyQt5(我刚开始学习它)。

我正在尝试创建一个窗口/布局,带有两个输入框(输入'start'和'end'日期),这样当单击每个时,触发QCalendarWidget弹出,当用户选择日期时,日期将输入QLineEdit字段。

到目前为止,它只是显示一个空白窗口,但我不确定我做错了什么。

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_()

1 个答案:

答案 0 :(得分:1)

有很多问题,让我们解决一些问题。

要查看窗口,您需要拨打QWidget.show()。您只能在self.show()方法中调用myCal。但myCal仅在鼠标单击时调用。当然,您希望在启动应用程序后立即显示窗口。要做到这一点,您只需将self.show()放在__init__方法的末尾。

class SelectedDate(QWidget):
    def __init__(self):
        # layout stuff, QLineEdit, etc
        self.show() # show your first window with the QLineEdit

接下来,鼠标按下事件。方法mousePressEvent实际上从未被调用过!您可以通过在其中添加print语句来检查它。 当检测到MouseButtonPress时(eventFilter

,应该调用它

最后是日历小部件。我们想在新窗口中打开它(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()

现在提出更多建议。您应该从一个简单的应用程序开始,并在它工作时构建更多功能。只为空白窗口编写大量代码不是一个好主意!因此,如果您再次执行此操作,请按步骤操作:

  • 显示一个带有QLineEdit的窗口(编写代码,测试它有效)
  • 实现事件过滤器(使用print语句查看它是否有效)
  • 点击QLineEdit
  • 时实施新的空白窗口
  • 使用日历填充该空白窗口
  • 将日历连接到QLineEdit文本(顺便提一下代码是好的)

此外,您可以使用更好的变量名称,一些建议:

  • selectedDate - > SelectDateWidget
  • selection - > date_selection
  • mousePressEvent - > on_date_selection_clicked
  • myCal - > open_calendar
  • cal - > calendar
  • showDate - > on_calendar_clickedupdate_date_selection_text