class MyWidget(QWidget): def __init__(self, parent=None): super().__init__(parent) horizontalLayout = QHBoxLayout() self.dayView = QTableView() self.dayView.setFrameShape(QFrame.Box) self.dayView.horizontalHeader().setStretchLastSection(True) self.dayView.verticalHeader().setVisible(False) horizontalLayout.addWidget(self.dayView) verticalLayout = QVBoxLayout() self.calendarWidget = QCalendarWidget() self.calendarWidget.setMinimumSize(QSize(250, 200)) self.calendarWidget.setMaximumSize(QSize(250, 200)) self.calendarWidget.setMinimumDate(QDate(2017, 1, 1)) self.calendarWidget.setMaximumDate(QDate(2030, 1, 1)) self.calendarWidget.selectionChanged.connect(self.dataChange) self.calendarWidget.setSelectedDate(QDate.currentDate()) verticalLayout.addWidget(self.calendarWidget) titleFV = QLabel('Food View') verticalLayout.addWidget(titleFV) self.filterLine = QLineEdit() self.filterLine.setMaximumSize(QSize(200, 25)) self.filterLine.textChanged.connect(self.filterChange) buttonAdd = QPushButton(QIcon("images/add.png"), '', None) buttonAdd.setMaximumSize(QSize(20, 30)) buttonAdd.clicked.connect(self.addFood) buttonDell = QPushButton(QIcon("images/del.png"), '', None) buttonDell.setMaximumSize(QSize(20, 30)) buttonDell.clicked.connect(self.delFood) lineEditLayout = QHBoxLayout() lineEditLayout.addWidget(self.filterLine) lineEditLayout.addWidget(buttonAdd) lineEditLayout.addWidget(buttonDell) verticalLayout.addLayout(lineEditLayout) self.foodView = QTableView() self.foodView.setMinimumSize(QSize(0, 0)) self.foodView.setMaximumSize(QSize(250, 1000)) self.foodView.verticalHeader().setVisible(False) self.foodView.horizontalHeader().setStretchLastSection(True) verticalLayout.addWidget(self.foodView) horizontalLayout.addLayout(verticalLayout) self.setLayout(horizontalLayout) model_in = QSqlRelationalTableModel() model_in.setEditStrategy(QSqlTableModel.OnFieldChange) model_in.setTable("intake_food") id_food = model_in.fieldIndex("id_food") date = model_in.fieldIndex("food_date") mass = model_in.fieldIndex("mass") # Set model, hide ID column model_in.setRelation(id_food, QSqlRelation("food", "id", "name")) model_in.setHeaderData(id_food, Qt.Horizontal, "Food") model_in.setHeaderData(date, Qt.Horizontal, "Date") model_in.setHeaderData(mass, Qt.Horizontal, "Mass") if not model_in.select(): self.showError(model_in.lastError()) return self.proxyModel_in = QSortFilterProxyModel() self.proxyModel_in.setSourceModel(model_in) self.proxyModel_in.setFilterKeyColumn(2) self.dayView.setItemDelegate(FlipProxyDelegate()) self.dayView.setModel(self.proxyModel_in) self.dayView.setColumnHidden(0, True) self.dayView.setColumnHidden(2, True) self.dayView.setSelectionMode(QAbstractItemView.SingleSelection) self.dayView.setContextMenuPolicy(Qt.CustomContextMenu) self.dayView.customContextMenuRequested.connect(self.ShowContextMenu) # filter day food by calendar widget self.dataChange() self.model_f = QSqlRelationalTableModel() self.model_f.setEditStrategy(QSqlTableModel.OnFieldChange) self.model_f.setTable("food") self.model_f.setHeaderData(1, Qt.Horizontal, "Food") self.model_f.setHeaderData(2, Qt.Horizontal, "Rate") if not self.model_f.select(): self.showError(self.model_f.lastError()) return self.proxyModel_f = QSortFilterProxyModel() self.proxyModel_f.setSourceModel(self.model_f) self.proxyModel_f.setFilterKeyColumn(1) self.foodView.setModel(self.proxyModel_f) self.foodView.setColumnHidden(0, True) self.foodView.setSelectionMode(QAbstractItemView.SingleSelection) self.foodView.setColumnWidth(1, 150) self.foodView.setColumnWidth(2, 90) def showError(self, err): QMessageBox.critical(self, "Unable to initialize Database", "Error initializing database: " + err.text()) def filterChange(self): regExp = QRegExp(self.filterLine.text(), Qt.CaseInsensitive, QRegExp.FixedString) self.proxyModel_f.setFilterRegExp(regExp) def dataChange(self): date = self.calendarWidget.selectedDate().toString('dd.MM.yyyy') regExp = QRegExp(date, Qt.CaseInsensitive, QRegExp.FixedString) self.proxyModel_in.setFilterRegExp(regExp) def addFood(self): self.model_f.insertRow(self.model_f.rowCount()) def delFood(self): self.model_f.removeRow(self.foodView.currentIndex().row()) self.model_f.select() def resizeEvent(self, event): self.dayView.setColumnWidth(1, self.dayView.width() * 0.7) self.dayView.setColumnWidth(3, self.dayView.width() * 0.2) QWidget.resizeEvent(self, event) def ShowContextMenu(self, pos): contextMenu = QMenu("Context menu", self) action1 = QAction("Add food eaten", self) contextMenu.addAction(action1) contextMenu.exec(self.mapToGlobal(pos))
class CalendarDemo(QWidget): #Initializer def __init__(self): super().__init__() self.setWindowTitle('Calendar') self.setGeometry(0, 0, 400, 350) self.activityText = "" self.counter = 0 self.initUI() self.setWindowIcon(QIcon('icon.png')) #Dialog window to get text def getText(self, year, month, day): text, okPressed = QInputDialog.getText(self, "ADD ACTIVITY", "ACTIVITY: ", QLineEdit.Normal, "") if okPressed and text != '': self.activityText = "{} \ {} \ {} {}".format( year, month, day, text) def initUI(self): #Calendar widget self.calendar = QCalendarWidget(self) self.calendar.setMinimumSize(400, 300) self.calendar.setFont(QFont("Berlin Sans FB", 15)) #Activity Label self.activity = QLabel(self) self.activity.move(20, 310) self.activity.setFont(QFont("Berlin Sans FB", 15)) #If there is no file named activity.txt, it creates try: activity = open("activity.txt", "r") self.activity.setText(activity.read()) activity.close() except: activity = open("activity.txt", "w") activity.close() #If there is no file named save.txt, it creates try: save = open("save.txt", "r") saveLines = save.readlines() selectedYear = int(saveLines[0]) selectedMonth = int(saveLines[1]) selectedDay = int(saveLines[2]) except: save = open("save.txt", "w") save.write("{}\n{}\n{}".format(datetime.now().year, datetime.now().month, datetime.now().day)) save.close() save = open("save.txt", "r") saveLines = save.readlines() selectedYear = int(saveLines[0]) selectedMonth = int(saveLines[1]) selectedDay = int(saveLines[2]) #If it's first time that user opened this app or there is no save.txt file, select today else select last selected date self.calendar.setSelectedDate( QDate(selectedYear, selectedMonth, selectedDay)) self.calendar.clicked.connect(self.click) #Onclick, run this function def click(self, qDate): save = open("save.txt", "r") saveLines = save.readlines() #One click selectedYear = int(saveLines[0]) selectedMonth = int(saveLines[1]) selectedDay = int(saveLines[2]) #Double click if qDate.year() == selectedYear and qDate.month( ) == selectedMonth and qDate.day() == selectedDay: self.getText(selectedYear, selectedMonth, selectedDay) self.activity.setProperty("text", self.activityText) self.activity.adjustSize() activity = open("activity.txt", "w") activity.write(self.activityText) activity.close() file = open("save.txt", "w") file.write("{}\n{}\n{}\n".format(qDate.year(), qDate.month(), qDate.day())) file.close()