【问题标题】:How to transfer date selection from calendar widget to QLineEdit如何将日期选择从日历小部件转移到 QLineEdit
【发布时间】:2018-06-19 08:54:38
【问题描述】:

我正在玩 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_()

【问题讨论】:

    标签: python python-3.x pyqt5 qcalendarwidget


    【解决方案1】:

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

    要查看窗口,您需要致电QWidget.show()。这里你只在myCal 方法中调用self.show()。但是myCal 只能通过鼠标单击来调用。当然,您想在启动应用程序后立即显示窗口。为此,您只需将 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 中)


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

    【讨论】:

    • 非常感谢,梅尔。我会仔细研究你的建议,然后告诉你进展如何。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-27
    • 1970-01-01
    • 2015-09-10
    • 1970-01-01
    相关资源
    最近更新 更多