0

我正在玩 PyQt5(我昨天才开始学习)。

我正在尝试创建一个窗口/布局,带有两个输入框(输入“开始”和“结束”日期),以便在单击每个输入框时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_()
4

1 回答 1

1

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

要查看窗口,您需要调用QWidget.show()。这里你只调用方法self.show()myCalmyCal只能通过鼠标单击调用。当然,您想在启动应用程序后立即显示窗口。为此,您只需将其放在方法self.show()的末尾即可__init__

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

接下来,鼠标按下事件。该方法mousePressEvent实际上从未被调用!您可以通过在其中添加打印语句来检查。当检测到 a 时应该调用它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(编写代码,测试它是否有效)
  • 实现事件过滤器(使用打印语句查看它是否有效)
  • 实现单击时打开一个新的空白窗口QLineEdit
  • 用日历填充那个空白窗口
  • 将日历连接到QLineEdit文本(顺便说一下,该代码很好)

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

  • selectedDate->SelectDateWidget
  • selection->date_selection
  • mousePressEvent->on_date_selection_clicked
  • myCal->open_calendar
  • cal->calendar
  • showDate->on_calendar_clickedupdate_date_selection_text
于 2018-01-10T10:31:00.983 回答