예제 #1
0
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))
예제 #2
0
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()