def createEditor(self): editor = QDateEdit() editor.setMinimumDate(self.minimumDate) # editor.setSpecialValueText(self.placeholderText) editor.setCalendarPopup(True) style = self.style() editor.setStyleSheet(style) # setup connections editor.dateChanged[QDate].connect(self.onActivated) return editor
class dateWidget(QWidget): def __init__(self, parent): super(dateWidget, self).__init__(parent=parent) self.start = 0 self.end = 0 # -------------------------------------------------------------------- # Date picker self.label_from = QLabel('From', parent) self.label_from.setAlignment(Qt.AlignCenter) self.label_from.setFont(QFont("Open Sans Bold", 12)) self.label_from.setStyleSheet("background-color: rgb(134,194,50);" "color: rgb(255,255,255);") self.label_from.resize(100, 20) self.label_from.move(20, 60) self.d1 = QDateEdit(parent, calendarPopup=True) self.d1.setDateTime(QDateTime.currentDateTime()) self.d1.setStyleSheet("background-color: rgb(255, 255, 255);") self.d1.setGeometry(20, 80, 100, 25) #self.d1.dateChanged.connect(self.date_change) label_to = QLabel('To', parent) label_to.setAlignment(Qt.AlignCenter) label_to.setFont(QFont("Open Sans Bold", 12)) label_to.setStyleSheet("background-color: rgb(134,194,50);" "color: rgb(255,255,255);") label_to.resize(100, 20) label_to.move(140, 60) self.d2 = QDateEdit(parent, calendarPopup=True) self.d2.setDateTime(QDateTime.currentDateTime()) self.d2.setStyleSheet("background-color: rgb(255, 255, 255);") self.d2.setGeometry(140, 80, 100, 25) def date_change(self): self.start = self.d1.dateTime().toString('yyyy-MM-dd') self.end = self.d2.dateTime().toString('yyyy-MM-dd')
class MainApp(QMainWindow): """Esta será la aplicación principal""" def __init__(self, parent=None, *args): super(MainApp, self).__init__(parent=parent) ''' configuración de la pantalla ''' self.setFixedSize( 850, 600) #El tamaño por defecto de la pantalla sin permitir ajustes self.setWindowTitle("Parámetros de la fotografía aérea" ) #Establece el título de la ventana self.setStyleSheet("background-color: rgb(85, 255, 127)" ) #Establece el color de fondo self.setWindowIcon(QIcon( "iconos/main_window.png")) #se establece un ícono para la pantalla ''' Configuración del título ''' self.label_t = QLabel("Definir los parámetros de la fotografía aérea", self) #instanciamos un label self.label_t.setGeometry( 0, 20, 800, 40) #definimos las propiedades geométricas del label self.label_t.setAlignment( Qt.AlignHCenter) #Aliniamos el label en el centro de la pantalla self.label_t.setFont(QFont( 'Times', 24)) #Definimos la fuente del texto del label ''' Configuración de los labels e inputs ''' #label 1 entidad self.label_e = QLabel("Entidad de donde proviene la fotografía:", self) self.label_e.setGeometry(50, 100, 800, 30) self.label_e.setAlignment(Qt.AlignLeft) self.label_e.setFont(QFont('Times', 12)) #input 1 entidad self.input_e = QLineEdit( self) #instanciamos un objeto para realizar una entrada self.input_e.move(600, 100) #movemos el input a estas coordenadas self.input_e.resize(200, 25) #Definimos el tamaño de el campo de texto self.input_e.setStyleSheet( "background-color: #fff") #el color del campo de texto será blanco self.input_e.setMaxLength( 50) #definimos la cantidad maxima de carácteres a recibir #label 2 número de vuelo self.label_n_v = QLabel("Número de vuelo:", self) self.label_n_v.setGeometry(50, 150, 800, 30) self.label_n_v.setAlignment(Qt.AlignLeft) self.label_n_v.setFont(QFont('Times', 12)) #input 2 número de vuelo self.input_n_v = QLineEdit(self) self.input_n_v.move(600, 150) self.input_n_v.resize(200, 25) self.input_n_v.setStyleSheet("background-color: #fff") self.input_n_v.setValidator( QIntValidator(0, 30000, self) ) #Validamos que solo se acepten valores numéricos con un rango de 0 a 30000 #label 3 faja de vuelo self.label_f_v = QLabel("Faja de vuelo:", self) self.label_f_v.setGeometry(50, 200, 800, 30) self.label_f_v.setAlignment(Qt.AlignLeft) self.label_f_v.setFont(QFont('Times', 12)) #input 3 faja de vuelo self.input_f_v = QLineEdit(self) self.input_f_v.move(600, 200) self.input_f_v.resize(200, 25) self.input_f_v.setStyleSheet("background-color: #fff") self.input_f_v.setMaxLength(50) #label 4 escala de la fotografía self.label_e_f = QLabel("Escala de la fotografía 1:", self) self.label_e_f.setGeometry(50, 250, 800, 30) self.label_e_f.setAlignment(Qt.AlignLeft) self.label_e_f.setFont(QFont('Times', 12)) #input 4 escala de la fotografía self.input_e_f = QLineEdit(self) self.input_e_f.move(600, 250) self.input_e_f.resize(200, 25) self.input_e_f.setStyleSheet("background-color: #fff") self.input_e_f.setValidator(QIntValidator(0, 300000, self)) #label 5 altura del vuelo self.label_a_v = QLabel("Altura del vuelo (en metros):", self) self.label_a_v.setGeometry(50, 300, 800, 30) self.label_a_v.setAlignment(Qt.AlignLeft) self.label_a_v.setFont(QFont('Times', 12)) #input 5 altura del vuelo self.input_a_v = QLineEdit(self) self.input_a_v.move(600, 300) self.input_a_v.resize(200, 25) self.input_a_v.setStyleSheet("background-color: #fff") self.input_a_v.setValidator(QIntValidator(0, 300000, self)) #label 6 distancia focal self.label_d_f = QLabel("Distancia focal:", self) self.label_d_f.setGeometry(50, 350, 800, 30) self.label_d_f.setAlignment(Qt.AlignLeft) self.label_d_f.setFont(QFont('Times', 12)) #input 6 distancia focal self.input_d_f = QLineEdit(self) self.input_d_f.move(600, 350) self.input_d_f.resize(200, 25) self.input_d_f.setStyleSheet("background-color: #fff") self.input_d_f.setValidator(QDoubleValidator(0.0, 1000000.0, 4, self)) #label 7 altura del terreno sobre el nivel del mar self.label_a_t_m = QLabel("Altura del terreno/nivel del mar:", self) self.label_a_t_m.setGeometry(50, 400, 800, 30) self.label_a_t_m.setAlignment(Qt.AlignLeft) self.label_a_t_m.setFont(QFont('Times', 12)) #input 7 altura del terreno sobre el nivel del mar self.input_a_t_m = QLineEdit(self) self.input_a_t_m.move(600, 400) self.input_a_t_m.resize(200, 25) self.input_a_t_m.setStyleSheet("background-color: #fff") self.input_a_t_m.setValidator(QIntValidator(0, 300000, self)) #label 8 fecha en que se tomn_v la fotografía self.label_f_f = QLabel("Fecha en que se tomó la fotografía:", self) self.label_f_f.setGeometry(50, 450, 800, 30) self.label_f_f.setAlignment(Qt.AlignLeft) self.label_f_f.setFont(QFont('Times', 12)) #input 8 fecha en que se tomó la fotografía self.input_f_f = QDateEdit(self) self.input_f_f.move(600, 450) self.input_f_f.resize(200, 25) self.input_f_f.setStyleSheet("background-color: #fff") ''' configuración del boton ''' #boton de aceptar self.btn_acept = QPushButton("Aceptar", self) #instanciamos un boton self.btn_acept.setGeometry(0, 0, 100, 50) self.btn_acept.move(375, 500) self.btn_acept.setStyleSheet("background-color: rgb(255, 255, 0)") self.btn_acept.clicked.connect( self.slot_aceptar ) #definimos que evento realizará al ser presionado self.label_er = QLabel( "", self ) #definimos un label de error en caso de no todos los campos estén llenos self.label_er.setGeometry(20, 575, 800, 30) self.label_er.setAlignment(Qt.AlignHCenter) self.label_er.setFont(QFont('Times', 12)) self.label_er.setStyleSheet("color: red") #Este es el evento que se va a ejecutar si se da en aceptar def slot_aceptar(self): #Creamos una lista con los textos de los campos para verificiar si están vacíos o no self.campos = [] self.campos.extend([ self.input_e.text(), self.input_n_v.text(), self.input_f_v.text(), self.input_e_f.text(), self.input_a_v.text(), self.input_d_f.text(), self.input_a_t_m.text(), self.input_f_f.text() ]) #Recorremos la lista anteriormente creada for i in self.campos: ''' ya que cada valor de i es un texto podemos preguntar si ese texto esta vacío o no de tal forma que aquí preguntamos si el texto es falso, es decir no hay texto, entonces mande un mensaje de error ''' if not i: return self.label_er.setText( "Uno o más campos están vacíos, Vuelve a intentarlo") else: ''' Una vez verificado que los campos están llenos, validamos que el valor de la altura del terreno sobre el mar es mayor a la altura de la fotografía, si esto no es así mandamos un mensaje de error pidiendo que se ingresen valores validos ''' if int(self.campos[4]) >= int(self.campos[-2]): return self.label_er.setText( "La altura del vuelo no puede ser mayor o igual a la altura del terreno sobre el mar" ) else: #Creamos un objeto de tipo CalApp para posteriormente mostrarla self.w = CalApp( self.campos) #Mandamos la lista de campos como parámetro self.w.show() #mostramos la pantalla
class UserPopup(QWidget): """Super class for the two popups which allows users to be edited or added. They are so similar that it warrants one super class which creates the labels and entries.""" def __init__(self, parent=None): super().__init__() self.controller = parent self.initUI() self.setWindowModality(Qt.ApplicationModal) self.show() def initUI(self): self.mainLayout = QVBoxLayout() lineEditsGroup = QGroupBox() grid = QGridLayout() #Create line edit labels for each field except user ID (non-editable) for i, key in enumerate(['Name', 'Birthday', 'Gender', 'Nationality']): grid.addWidget(QLabel(key + "*"), i, 0) #Create name line entry self.nameEntry = QLineEdit(self) grid.addWidget(self.nameEntry, 0, 1) #Create birthday entry self.birthdayEntry = QDateEdit(self) grid.addWidget(self.birthdayEntry, 1, 1) #Create gender selection self.genderBox = QComboBox(self) self.genderBox.addItem("Male") self.genderBox.addItem("Female") self.genderBox.addItem("Other") grid.addWidget(self.genderBox, 2, 1) #Add nationality self.nationEntry = QLineEdit(self) grid.addWidget(self.nationEntry, 3, 1) lineEditsGroup.setLayout(grid) self.mainLayout.addWidget(lineEditsGroup) self.setLayout(self.mainLayout) def verifyInputValidity(self): """Triggers when user tries to save changes. Checks all fields for correct data.""" #Reset borders in case of earlier tries for field in [ self.nameEntry, self.birthdayEntry, self.genderBox, self.nationEntry ]: field.setStyleSheet("border: 1px solid black") if self.nameEntry.text().strip() == "": self.nameEntry.setStyleSheet("border: 2px solid red") return 1 if (self.birthdayEntry.date() >= QDate().currentDate()): self.birthdayEntry.setStyleSheet("border: 2px solid red") return 1 if self.genderBox.currentText().strip() not in [ "Male", "Female", "Other" ]: self.genderBox.setStyleSheet("border: 2px solid red") return 1 if self.nationEntry.text().strip() == "": self.nationEntry.setStyleSheet("border: 2px solid red") return 1 return 0
class HomeScreen(QMainWindow): def __init__(self, parent=None): super().__init__(parent) self.setWindowTitle("Home Screen") self.resize(550, 461) self.setStyleSheet(Hariku_Style.get_window_stylesheet()) self.centralWidget = QWidget() self.setCentralWidget(self.centralWidget) self.setupUI() def setupUI(self): self.setWindowIcon(Hariku_Style.getIcon()) self.centralwidget = QWidget(self) self.setFocus() self.gridLayout = QGridLayout(self.centralwidget) self.gridLayout.setObjectName("gridLayout") self.topcenter_layout = QHBoxLayout() spacerItem = QSpacerItem(25, 20, QSizePolicy.MinimumExpanding, QSizePolicy.Minimum) self.topcenter_layout.addItem(spacerItem) self.monthFilter = QDateEdit(self.centralwidget) self.monthFilter.setCurrentSection(QDateTimeEdit.MonthSection) self.monthFilter.setButtonSymbols(QSpinBox.NoButtons) self.monthFilter.setDate(datetime.now()) self.monthFilter.setDisplayFormat("MMMM/yyyy") self.monthFilter.setFont(Hariku_Style.get_font(10)) self.monthFilter.setStyleSheet(Hariku_Style.get_dateedit_stylesheet()) self.monthFilter.dateChanged.connect(self.filterDiaryByMonth) self.topcenter_layout.addWidget(self.monthFilter) self.showAllBtn = QPushButton("Remove Filter", self.centralwidget) self.showAllBtn.setFont(Hariku_Style.get_font(8)) self.showAllBtn.clicked.connect(self.getDiaries) self.showAllBtn.setStyleSheet( Hariku_Style.get_moodBtn_stylesheet("rgb(38, 160, 173)", "rgb(8, 102, 112)")) self.topcenter_layout.addWidget(self.showAllBtn) spacerItem1 = QSpacerItem(25, 20, QSizePolicy.MinimumExpanding, QSizePolicy.Minimum) self.topcenter_layout.addItem(spacerItem1) self.gridLayout.addLayout(self.topcenter_layout, 1, 0, 1, 1) self.bottomLayout = QHBoxLayout() spacerItem2 = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.bottomLayout.addItem(spacerItem2) self.createBtn = QPushButton("+ Add New Diary", self.centralwidget) self.createBtn.setFont(Hariku_Style.get_font(10)) self.createBtn.clicked.connect(self.addNewDiary) self.createBtn.setStyleSheet( Hariku_Style.get_moodBtn_stylesheet("rgb(40, 186, 130)", "rgb(207, 207, 188)")) self.bottomLayout.addWidget(self.createBtn) self.gridLayout.addLayout(self.bottomLayout, 4, 0, 1, 1) self.contentScrollArea = QScrollArea(self.centralwidget) self.contentScrollArea.setEnabled(True) sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.contentScrollArea.sizePolicy().hasHeightForWidth()) self.contentScrollArea.setSizePolicy(sizePolicy) self.contentScrollArea.setStyleSheet( Hariku_Style.get_scrollarea_stylesheet()) self.contentScrollArea.setWidgetResizable(True) self.contentScrollArea.setAlignment(QtCore.Qt.AlignLeading | QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop) self.scrollAreaWidgetContents = QWidget() self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 487, 321)) self.scrollAreaLayout = QVBoxLayout(self.scrollAreaWidgetContents) self.getDiaries() self.contentScrollArea.setWidget(self.scrollAreaWidgetContents) self.gridLayout.addWidget(self.contentScrollArea, 2, 0, 1, 1) self.judul = QLabel("\nWelcome Home:)\n", self) self.judul.setFont(Hariku_Style.get_font(18)) self.judul.setAlignment(QtCore.Qt.AlignCenter) self.gridLayout.addWidget(self.judul, 0, 0, 1, 1) self.setCentralWidget(self.centralwidget) def addNewDiary(self): dialog = DiaryScreen(self) dialog.show() self.hide() def clearScrollAreaLayout(self): # delete the diaries currently showind for i in reversed(range(self.scrollAreaLayout.count())): try: self.scrollAreaLayout.itemAt(i).widget().setParent(None) except AttributeError: self.scrollAreaLayout.removeItem( self.scrollAreaLayout.itemAt(i)) def filterDiaryByMonth(self): self.clearScrollAreaLayout() year = self.monthFilter.date().year() month = self.monthFilter.date().month() diaries = getDiaryByMonth(year, month) for i, diary in enumerate(diaries): self.diaryItem = QWidget(self.scrollAreaWidgetContents) sizePolicy = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed) sizePolicy.setHeightForWidth( self.diaryItem.sizePolicy().hasHeightForWidth()) self.diaryItem.setSizePolicy(sizePolicy) self.diaryItem.setMinimumSize(QtCore.QSize(0, 50)) self.diaryItem.setStyleSheet( "background-color: rgba(227, 217, 163, 100%);\nborder-radius : 10px;" ) self.diaryItem.setObjectName("diaryItem") self.itemLayout = QGridLayout(self.diaryItem) self.contentDateLayout = QVBoxLayout() self.contentDateLayout.setObjectName("contentDateLayout") self.content = QLabel(self.truncateString(diary.content), self.diaryItem) self.content.setFont(Hariku_Style.get_font(10)) self.contentDateLayout.addWidget(self.content) self.date = QLabel( diary.date.strftime("%d %B %Y") + diary.time.strftime(" %I:%M %p"), self.diaryItem) self.date.setFont(Hariku_Style.get_font(8)) self.contentDateLayout.addWidget(self.date) self.itemLayout.addLayout(self.contentDateLayout, 0, 0, 1, 1) self.buttons.append(i) self.buttons[i] = [ QPushButton("⋗", self.diaryItem), QPushButton("×", self.diaryItem) ] self.buttons[i][0].clicked.connect( lambda checked, i=diary.diary_id: self.viewDiaryById(i)) sizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.buttons[i][0].sizePolicy().hasHeightForWidth()) self.buttons[i][0].setSizePolicy(sizePolicy) self.buttons[i][0].setFont(Hariku_Style.get_font(9)) self.buttons[i][0].setStyleSheet( Hariku_Style.get_moodBtn_stylesheet("rgb(145, 133, 63)", "rgb(235, 224, 157)")) self.itemLayout.addWidget(self.buttons[i][0], 0, 1, 1, 1) # self.deleteBtn = QPushButton("×", self.diaryItem) self.buttons[i][1].clicked.connect( lambda checked, i=diary.diary_id: self.deleteDiaryById(i)) sizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.buttons[i][1].sizePolicy().hasHeightForWidth()) self.buttons[i][1].setSizePolicy(sizePolicy) self.buttons[i][1].setFont(Hariku_Style.get_font(9)) self.buttons[i][1].setStyleSheet( Hariku_Style.get_moodBtn_stylesheet("rgb(145, 63, 63)", "rgb(235, 157, 157)")) self.itemLayout.addWidget(self.buttons[i][1], 0, 2, 1, 1) self.scrollAreaLayout.addWidget(self.diaryItem, alignment=QtCore.Qt.AlignTop) spacerItem2 = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.MinimumExpanding) self.scrollAreaLayout.addItem(spacerItem2) def getDiaries(self): diaries = getAllDiaries() self.monthFilter.setDate(datetime.now()) self.clearScrollAreaLayout() self.buttons = [] for i, diary in enumerate(diaries): self.diaryItem = QWidget(self.scrollAreaWidgetContents) sizePolicy = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed) sizePolicy.setHeightForWidth( self.diaryItem.sizePolicy().hasHeightForWidth()) self.diaryItem.setSizePolicy(sizePolicy) self.diaryItem.setMinimumSize(QtCore.QSize(0, 50)) self.diaryItem.setStyleSheet( "background-color: rgba(227, 217, 163, 100%);\nborder-radius : 10px;" ) self.diaryItem.setObjectName("diaryItem") self.itemLayout = QGridLayout(self.diaryItem) self.contentDateLayout = QVBoxLayout() self.contentDateLayout.setObjectName("contentDateLayout") self.content = QLabel(self.truncateString(diary.content), self.diaryItem) self.content.setFont(Hariku_Style.get_font(10)) self.contentDateLayout.addWidget(self.content) self.date = QLabel( diary.date.strftime("%d %B %Y") + diary.time.strftime(" %I:%M %p"), self.diaryItem) self.date.setFont(Hariku_Style.get_font(8)) self.contentDateLayout.addWidget(self.date) self.itemLayout.addLayout(self.contentDateLayout, 0, 0, 1, 1) self.buttons.append(i) self.buttons[i] = [ QPushButton("⋗", self.diaryItem), QPushButton("×", self.diaryItem) ] self.buttons[i][0].clicked.connect( lambda checked, i=diary.diary_id: self.viewDiaryById(i)) sizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.buttons[i][0].sizePolicy().hasHeightForWidth()) self.buttons[i][0].setSizePolicy(sizePolicy) self.buttons[i][0].setFont(Hariku_Style.get_font(9)) self.buttons[i][0].setStyleSheet( Hariku_Style.get_moodBtn_stylesheet("rgb(145, 133, 63)", "rgb(235, 224, 157)")) self.itemLayout.addWidget(self.buttons[i][0], 0, 1, 1, 1) # self.deleteBtn = QPushButton("×", self.diaryItem) self.buttons[i][1].clicked.connect( lambda checked, i=diary.diary_id: self.deleteDiaryById(i)) sizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.buttons[i][1].sizePolicy().hasHeightForWidth()) self.buttons[i][1].setSizePolicy(sizePolicy) self.buttons[i][1].setFont(Hariku_Style.get_font(9)) self.buttons[i][1].setStyleSheet( Hariku_Style.get_moodBtn_stylesheet("rgb(145, 63, 63)", "rgb(235, 157, 157)")) self.itemLayout.addWidget(self.buttons[i][1], 0, 2, 1, 1) self.scrollAreaLayout.addWidget(self.diaryItem, alignment=QtCore.Qt.AlignTop) spacerItem2 = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.MinimumExpanding) self.scrollAreaLayout.addItem(spacerItem2) def truncateString(self, string): try: string = string.replace('\n', ' ') return string[:45] + '...' except IndexError: return string def viewDiaryById(self, id): dialog = DiaryScreen(self, edit=False, id=id) dialog.show() self.hide() def deleteDiaryById(self, id): deleteDiaryById(id) self.clearScrollAreaLayout() self.getDiaries()