Как перенести выбор даты из виджета календаря в QLineEdit

Я играю с 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_()

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 на самом деле никогда не звонил! Вы можете проверить это, добавив в него оператор печати. Это следует называть, когда 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_clicked или же update_date_selection_text
Другие вопросы по тегам