Как перенести выбор даты из виджета календаря в 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