Вывод даты из QCalendarWidget
Всем привет. Пишу небольшое приложение на Python с помощью библиотеки PyQt5.
Что нужно:
В виджет QLabel или QTextEdit (не принципиально) нужно вывести дату, уменьшенную на n дней от выбранной даты в виджете QCalendarWidget.
Я попытался разобраться с описанием библиотеки, но не смог.
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1103, 600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.calendarWidget = QtWidgets.QCalendarWidget(self.centralwidget)
self.calendarWidget.setGeometry(QtCore.QRect(0, 30, 561, 541))
self.calendarWidget.setGridVisible(True)
self.calendarWidget.setSelectionMode(QtWidgets.QCalendarWidget.SingleSelection)
self.calendarWidget.setHorizontalHeaderFormat(QtWidgets.QCalendarWidget.ShortDayNames)
self.calendarWidget.setVerticalHeaderFormat(QtWidgets.QCalendarWidget.NoVerticalHeader)
self.calendarWidget.setObjectName("calendarWidget")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(590, 30, 451, 121))
self.label.setObjectName("label")
self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
self.textEdit.setGeometry(QtCore.QRect(640, 180, 221, 71))
self.textEdit.setObjectName("textEdit")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 1103, 21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
self.calendarWidget.clicked['QDate'].connect(self.label.setObjectName(???)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
Вот в этой строке кода:
self.calendarWidget.clicked['QDate'].connect(self.label.setObjectName(???)
нужно прописать что-то, чтобы все заработало. А может я в принципе неправильный путь выбрал и задуманное мной, реализуется проще?
Ответы (2 шт):
Автор решения: Alexander Chernin
→ Ссылка
Для простоты в качестве родителя возьму QWidget:
class Window(QWidget):
def __init__(QWidget parent=None):
QWidget.__init__(parent)
# Создаем менеджер вертикального расположения виджетов на родителе
self.setLayout(QVBoxLayout())
# Календарь
self.calendar = QCalendarWidget()
# Количество дней от даты, выбранной в календаре
# Тем самые ваши n-дней, на которые надо уменьшить
# значение даты в QCalendarWidget
self.days = QSpinBox()
# Результат будет выведен в эту метку
self.label = QLabel()
# Последовательно (сверху-вниз) добавляем виджеты в менеджер расположения
layout().addWidget(self.days)
layout().addWidget(self.label)
layout().addWidget(self.calendar)
# Если на календаре выбрали новую дату, то
# обновляем дату в метке с учетом значения в days (QSpinBox)
self.calendar.clicked.connect(
lambda date: self.updateLabel(self.days.value(), date))
# Если изменили количество дней в days, то обновляем метку, с учетом
# значения текущей даты в календаре
self.days.valueChanged.connect(
lambda i: self.updateLabel(i, self.calendar.selectedDate()))
def updateLabel(days, QDate calendarDate):
# -1 означает, что мы отнимаем заданное количество дней
date = calendarDate.addDays(-1 * days)
# Обновляем результат в метке
self.label.setText(date.toString("dd.MM.yyyy"))
Автор решения: S. Nick
→ Ссылка
Не изменяйте код, сгенерированный Qt Designer. Создайте другой класс,
который наследуется от соответствующего виджета, и используйте созданный класс для его заполнения.
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1103, 600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.calendarWidget = QtWidgets.QCalendarWidget(self.centralwidget)
self.calendarWidget.setGeometry(QtCore.QRect(0, 30, 561, 541))
self.calendarWidget.setGridVisible(True)
self.calendarWidget.setSelectionMode(QtWidgets.QCalendarWidget.SingleSelection)
self.calendarWidget.setHorizontalHeaderFormat(QtWidgets.QCalendarWidget.ShortDayNames)
self.calendarWidget.setVerticalHeaderFormat(QtWidgets.QCalendarWidget.NoVerticalHeader)
self.calendarWidget.setObjectName("calendarWidget")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(590, 30, 451, 121))
self.label.setObjectName("label")
self.textEdit = QtWidgets.QTextEdit(self.centralwidget)
self.textEdit.setGeometry(QtCore.QRect(640, 180, 221, 71))
self.textEdit.setObjectName("textEdit")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 1103, 21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
# self.retranslateUi(MainWindow)
# self.calendarWidget.clicked['QDate'].connect(self.label.setObjectName(???)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.calendarWidget.clicked['QDate'].connect(self.show_date_func)
def show_date_func(self):
days = int(self.textEdit.toPlainText()) if self.textEdit.toPlainText() else 0
date = self.calendarWidget.selectedDate().addDays(-1 * days)
self.label.setText(date.toString('dd-MM-yyyy'))
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
