def __init__(self, parent=None): super(MainWin, self).__init__(parent) dt_ed = QDateTimeEdit(self) dt_ed2 = QDateTimeEdit(QDateTime.currentDateTime(), self) d_ed = QDateTimeEdit(QDate.currentDate(), self) t_ed = QDateTimeEdit(QTime.currentTime(), self) dt_ed.setDisplayFormat('yyyy-MM-dd HH:mm:ss') dt_ed2.setDisplayFormat('yyyy/MM/dd HH-mm-ss') d_ed.setDisplayFormat('yyyy.MM.dd') t_ed.setDisplayFormat('HH:mm:ss') dt_ed.setMinimumDate(QDate.currentDate().addDays(-365)) dt_ed.setMaximumDate(QDate.currentDate().addDays(365)) dt_ed.setCalendarPopup(True) layout = QVBoxLayout(self) layout.addWidget(dt_ed) layout.addWidget(dt_ed2) layout.addWidget(d_ed) layout.addWidget(t_ed) self.setGeometry(100, 100, 250, 150) self.setWindowTitle('DateTimeEdit')
def initUI(self): self.setWindowTitle('不同风格的日期格式') layout = QVBoxLayout() datetime1 = QDateTimeEdit(QDateTime.currentDateTime()) datetime2 = QDateTimeEdit(QDateTime.currentDateTime()) date = QDateTimeEdit(QDate.currentDate()) time = QDateTimeEdit(QTime.currentTime()) # 设置最大最小日期时间、下拉日期 datetime1.setMaximumDate(QDate.currentDate().addDays(365)) datetime1.setMinimumDate(QDate.currentDate().addDays(-365)) datetime1.setCalendarPopup(True) datetime1.setDisplayFormat('yyyy-MM-dd HH:mm:ss') datetime2.setDisplayFormat('yyyy/MM/dd HH-mm-ss') date.setDisplayFormat('yyyy-MM-dd') time.setDisplayFormat('HH:mm:ss') # 为信号设置槽 self.datetime1 = datetime1 datetime1.dateTimeChanged.connect(self.ChangeDateTime) datetime2.dateChanged.connect(self.ChangeDate) self.btn = QPushButton('点击获取时间') self.btn.clicked.connect(self.Onclick_Button) layout.addWidget(datetime1) layout.addWidget(datetime2) layout.addWidget(date) layout.addWidget(time) layout.addWidget(self.btn) self.setLayout(layout)
def createEditor(self, parent, option, index): """ Crée le widget utilisé pour éditer la valeur d'une cellule Retourne un widget "vierge", i.e. ce n'est pas ici qu'on initialise la valeur du widget. En revanche, c'est ici qu'on peut définir les valeurs min/max acceptées, etc. https://doc.qt.io/qt-5/model-view-programming.html#providing-an-editor """ editor = QDateTimeEdit(parent=parent) editor.setMinimumDate( datetime.datetime(year=2017, month=9, day=1, hour=8, minute=30)) editor.setMaximumDate( datetime.datetime(year=2030, month=9, day=1, hour=18, minute=30)) editor.setDisplayFormat("yyyy-MM-dd HH:mm") #editor.setCalendarPopup(True) # setFrame(): tell whether the line edit draws itself with a frame. # If enabled (the default) the line edit draws itself inside a frame, otherwise the line edit draws itself without any frame. editor.setFrame(False) action = QAction(editor) # <- action.setShortcut(Qt.CTRL | Qt.Key_Delete) # <- #action.setShortcut(Qt.Key_Delete) # the keyevent for the suppr key is already catched by the editor thus it doesn't work... action.triggered.connect( lambda: self.deleteActionCallback(editor, index)) # <- editor.addAction(action) # <- return editor
def createEditor(self, parent, option, index): editor = QDateTimeEdit(parent=parent) editor.setMinimumDate(datetime.datetime(year=2017, month=9, day=1, hour=8, minute=30)) editor.setMaximumDate(datetime.datetime(year=2020, month=9, day=1, hour=18, minute=30)) editor.setDisplayFormat("yyyy-MM-dd HH:mm:ss") #editor.setCalendarPopup(True) # setFrame(): tell whether the line edit draws itself with a frame. # If enabled (the default) the line edit draws itself inside a frame, otherwise the line edit draws itself without any frame. editor.setFrame(False) return editor
class MainWin(QWidget): def __init__(self, parent=None): super(MainWin, self).__init__(parent) layout = QVBoxLayout(self) self.dateEdit = QDateTimeEdit(QDateTime.currentDateTime(), self) self.dateEdit.setDisplayFormat('yyyy-MM-dd HH:mm:ss') self.dateEdit.setMinimumDate(QDate.currentDate().addDays(-365)) self.dateEdit.setMaximumDate(QDate.currentDate().addDays(365)) self.dateEdit.setCalendarPopup(True) self.dateEdit.dateChanged.connect(self.onDateChanged) self.dateEdit.dateTimeChanged.connect(self.onDateTimeChanged) self.dateEdit.timeChanged.connect(self.onTimeChanged) self.btn = QPushButton('取得日期和時間') self.btn.clicked.connect(self.onButtonClick) layout.addWidget(self.dateEdit) layout.addWidget(self.btn) self.resize(300, 90) self.setWindowTitle('DateTimeEdit2') def onDateChanged(self, date): print(date) def onDateTimeChanged(self, dateTime): print(dateTime) def onTimeChanged(self, time): print(time) def onButtonClick(self): dateTime = self.dateEdit.dateTime() maxDate = self.dateEdit.maximumDate() maxDateTime = self.dateEdit.maximumDateTime() maxTime = self.dateEdit.maximumTime() minDate = self.dateEdit.minimumDate() minDateTime = self.dateEdit.minimumDateTime() minTime = self.dateEdit.minimumTime() print('\n選擇的日期時間') print('dateTime = %s') print('maxDate = %s' % str(maxDate)) print('maxDateTime = %s' % str(maxDateTime)) print('maxTime = %s' % str(maxTime)) print('minDate = %s' % str(minDate)) print('minDateTime = %s' % str(minDateTime)) print('minTime = %s' % str(minTime))
def createEditor(self, parent, option, index): editor = QDateTimeEdit(parent=parent) editor.setMinimumDate( datetime.datetime(year=2017, month=9, day=1, hour=8, minute=30)) editor.setMaximumDate( datetime.datetime(year=2020, month=9, day=1, hour=18, minute=30)) editor.setDisplayFormat("yyyy-MM-dd HH:mm:ss") #editor.setCalendarPopup(True) # setFrame(): tell whether the line edit draws itself with a frame. # If enabled (the default) the line edit draws itself inside a frame, otherwise the line edit draws itself without any frame. editor.setFrame(False) return editor
def createEditor(self, parent, option, index): """ Crée le widget utilisé pour éditer la valeur d'une cellule Retourne un widget "vierge", i.e. ce n'est pas ici qu'on initialise la valeur du widget. En revanche, c'est ici qu'on peut définir les valeurs min/max acceptées, etc. https://doc.qt.io/qt-5/model-view-programming.html#providing-an-editor """ editor = QDateTimeEdit(parent=parent) editor.setMinimumDate( datetime.datetime(year=2017, month=9, day=1, hour=8, minute=30)) editor.setMaximumDate( datetime.datetime(year=2030, month=9, day=1, hour=18, minute=30)) editor.setDisplayFormat("yyyy-MM-dd HH:mm") #editor.setCalendarPopup(True) # setFrame(): tell whether the line edit draws itself with a frame. # If enabled (the default) the line edit draws itself inside a frame, otherwise the line edit draws itself without any frame. editor.setFrame(False) return editor
class Window(QWidget): def __init__(self): super().__init__() # Make widgets ################# self.edit1 = QDateTimeEdit() self.edit2 = QDateTimeEdit() self.edit3 = QDateTimeEdit() self.edit1.setMinimumDate(datetime.datetime(year=2017, month=9, day=1, hour=8, minute=30, second=30)) self.edit2.setMinimumDate(datetime.datetime(year=2017, month=9, day=1, hour=8, minute=30, second=30)) self.edit3.setMinimumDate(datetime.datetime(year=2017, month=9, day=1, hour=8, minute=30, second=30)) self.edit1.setMaximumDate(datetime.datetime(year=2020, month=9, day=1, hour=18, minute=30, second=30)) self.edit2.setMaximumDate(datetime.datetime(year=2020, month=9, day=1, hour=18, minute=30, second=30)) self.edit3.setMaximumDate(datetime.datetime(year=2020, month=9, day=1, hour=18, minute=30, second=30)) self.edit1.setDateTime(datetime.datetime.now()) self.edit2.setDateTime(datetime.datetime.now()) self.edit3.setDateTime(datetime.datetime.now()) #self.edit1.setCalendarPopup(True) #self.edit2.setCalendarPopup(True) #self.edit3.setCalendarPopup(True) # Format: see http://doc.qt.io/qt-5/qdatetime.html#toString-2 self.edit1.setDisplayFormat("yyyy-MM-dd HH:mm") self.edit2.setDisplayFormat("dd/MM/yyyy HH:mm:ss t") self.edit3.setDisplayFormat("dddd d MMMM yyyy h m AP") self.btn = QPushButton("Print") # Set button slot ############## self.btn.clicked.connect(self.printText) # Set the layout ############### vbox = QVBoxLayout() vbox.addWidget(self.edit1) vbox.addWidget(self.edit2) vbox.addWidget(self.edit3) vbox.addWidget(self.btn) self.setLayout(vbox) def printText(self): print(self.edit1.text()) print(self.edit2.text()) print(self.edit3.text())
class Window(QWidget): def __init__(self): super().__init__() # Make widgets ################# self.edit1 = QDateTimeEdit() self.edit2 = QDateTimeEdit() self.edit3 = QDateTimeEdit() self.edit1.setMinimumDate(datetime.datetime(year=2017, month=9, day=1, hour=8, minute=30, second=30)) self.edit2.setMinimumDate(datetime.datetime(year=2017, month=9, day=1, hour=8, minute=30, second=30)) self.edit3.setMinimumDate(datetime.datetime(year=2017, month=9, day=1, hour=8, minute=30, second=30)) self.edit1.setMaximumDate(datetime.datetime(year=2020, month=9, day=1, hour=18, minute=30, second=30)) self.edit2.setMaximumDate(datetime.datetime(year=2020, month=9, day=1, hour=18, minute=30, second=30)) self.edit3.setMaximumDate(datetime.datetime(year=2020, month=9, day=1, hour=18, minute=30, second=30)) self.edit1.setDateTime(datetime.datetime.now()) self.edit2.setDateTime(datetime.datetime.now()) self.edit3.setDateTime(datetime.datetime.now()) self.edit1.setCalendarPopup(True) self.edit2.setCalendarPopup(True) self.edit3.setCalendarPopup(True) # Format: see http://doc.qt.io/qt-5/qdatetime.html#toString-2 self.edit1.setDisplayFormat("yyyy-MM-dd HH:mm") self.edit2.setDisplayFormat("dd/MM/yyyy HH:mm:ss t") self.edit3.setDisplayFormat("dddd d MMMM yyyy h m AP") self.btn = QPushButton("Print") # Set button slot ############## self.btn.clicked.connect(self.printText) # Set the layout ############### vbox = QVBoxLayout() vbox.addWidget(self.edit1) vbox.addWidget(self.edit2) vbox.addWidget(self.edit3) vbox.addWidget(self.btn) self.setLayout(vbox) def printText(self): print(self.edit1.text()) print(self.edit2.text()) print(self.edit3.text())
class DateTimeDialog(QDialog): """Dialog to specify time in the recordings, either as seconds from the start of the recordings or absolute time. Parameters ---------- title : str 'Lights out' or 'Lights on' start_time : datetime absolute start time of the recordings dur : int total duration of the recordings Notes ----- The value of interest is in self.idx_seconds.value(), which is seconds from the start of the recordings. """ def __init__(self, title, start_time, dur): super().__init__() self.start_time = start_time self.dur = dur end_time = start_time + timedelta(seconds=dur) self.setWindowTitle(title) bbox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) self.idx_ok = bbox.button(QDialogButtonBox.Ok) self.idx_cancel = bbox.button(QDialogButtonBox.Cancel) bbox.clicked.connect(self.button_clicked) self.idx_seconds = QSpinBox() self.idx_seconds.setMinimum(0) self.idx_seconds.setMaximum(dur) self.idx_seconds.valueChanged.connect(self.changed_spin) self.idx_datetime = QDateTimeEdit(start_time) self.idx_datetime.setMinimumDate(start_time) self.idx_datetime.setMaximumDate(end_time) self.idx_datetime.setDisplayFormat('dd-MMM-yyyy HH:mm:ss') self.idx_datetime.dateTimeChanged.connect(self.changed_datetime) layout = QFormLayout() layout.addRow('', QLabel('Enter ' + title + ' time')) layout.addRow('Seconds from recording start', self.idx_seconds) layout.addRow('Absolute time', self.idx_datetime) layout.addRow(bbox) self.setLayout(layout) def button_clicked(self, button): if button == self.idx_ok: self.accept() elif button == self.idx_cancel: self.reject() def changed_spin(self, i): self.idx_datetime.blockSignals(True) self.idx_datetime.setDateTime(self.start_time + timedelta(seconds=i)) self.idx_datetime.blockSignals(False) def changed_datetime(self, dt): val = (dt.toPyDateTime() - self.start_time).total_seconds() if val < 0 or val >= self.dur: val = min(self.dur, max(val, 0)) self.changed_spin(val) self.idx_seconds.blockSignals(True) self.idx_seconds.setValue(val) self.idx_seconds.blockSignals(False)
class BRFManager(myqt.QFrameLayout): def __init__(self, wldset=None, parent=None): super(BRFManager, self).__init__(parent) self.viewer = BRFViewer(wldset, parent) self.kgs_brf_installer = None self.__initGUI__() def __initGUI__(self): self.setContentsMargins(10, 10, 10, 10) self._bplag = {} self._bplag['label'] = QLabel('BP Lags Nbr:') self._bplag['widget'] = myqt.QDoubleSpinBox(100, 0) self._bplag['widget'].setRange(1, 9999) self._bplag['widget'].setValue(300) self._bplag['widget'].setKeyboardTracking(True) self._etlag = {} self._etlag['label'] = QLabel('ET Lags Nbr:') self._etlag['widget'] = myqt.QDoubleSpinBox(300, 0) self._etlag['widget'].setRange(-1, 9999) self._etlag['widget'].setValue(300) self._etlag['widget'].setKeyboardTracking(True) # ---- BRF Data Range ---- self._datastart = QDateTimeEdit() self._datastart.setCalendarPopup(True) self._datastart.setDisplayFormat('dd/MM/yyyy') self._dataend = QDateTimeEdit() self._dataend.setCalendarPopup(True) self._dataend.setDisplayFormat('dd/MM/yyyy') self.btn_seldata = QToolButtonSmall(icons.get_icon('select_range')) self.btn_seldata.clicked.connect(self.get_datarange) # ---- Detrend and Correct Options ---- self._detrend = QCheckBox('Detrend') self._detrend.setCheckState(Qt.Checked) self._correct = QCheckBox('Correct WL') self._correct.setEnabled(False) # ---- Toolbar btn_comp = QPushButton('Compute BRF') btn_comp.clicked.connect(self.calc_brf) btn_comp.setFocusPolicy(Qt.NoFocus) self.btn_show = btn_show = QToolButtonSmall(icons.get_icon('search')) btn_show.clicked.connect(self.viewer.show) # Layout tbar = myqt.QFrameLayout() tbar.addWidget(btn_comp, 0, 0) tbar.addWidget(btn_show, 0, 1) tbar.setColumnStretch(0, 100) # ---- Main Layout row = 0 self.addWidget(self._bplag['label'], row, 0) self.addWidget(self._bplag['widget'], row, 1) row += 1 self.addWidget(self._etlag['label'], row, 0) self.addWidget(self._etlag['widget'], row, 1) row += 1 self.setRowMinimumHeight(row, 15) row += 1 self.addWidget(QLabel('BRF Start :'), row, 0) self.addWidget(self._datastart, row, 1) self.addWidget(self.btn_seldata, row, 2) row += 1 self.addWidget(QLabel('BRF End :'), row, 0) self.addWidget(self._dataend, row, 1) row += 1 self.setRowMinimumHeight(row, 15) row += 1 self.addWidget(self._detrend, row, 0, 1, 2) row += 1 self.addWidget(self._correct, row, 0, 1, 2) row += 1 self.setRowMinimumHeight(row, 5) self.setRowStretch(row, 100) row += 1 self.addWidget(tbar, row, 0, 1, 3) self.setColumnStretch(self.columnCount(), 100) # ---- Install Panel if not KGSBRFInstaller().kgsbrf_is_installed(): self.__install_kgs_brf_installer() # ---- Properties @property def lagBP(self): return self._bplag['widget'].value() @property def lagET(self): return self._etlag['widget'].value() @property def detrend(self): if self._detrend.checkState(): return 'Yes' else: return 'No' @property def correct_WL(self): return 'No' @property def brfperiod(self): y, m, d = self._datastart.date().getDate() dstart = xldate_from_date_tuple((y, m, d), 0) y, m, d = self._dataend.date().getDate() dend = xldate_from_date_tuple((y, m, d), 0) return (dstart, dend) # ---- KGS BRF installer def __install_kgs_brf_installer(self): """ Installs a KGSBRFInstaller that overlays the whole brf tool layout until the KGS_BRF program is installed correctly. """ self.kgs_brf_installer = KGSBRFInstaller() self.kgs_brf_installer.sig_kgs_brf_installed.connect( self.__uninstall_kgs_brf_installer) self.addWidget(self.kgs_brf_installer, 0, 0, self.rowCount(), self.columnCount()) def __uninstall_kgs_brf_installer(self): """ Uninstall the KGSBRFInstaller after the KGS_BRF program has been installed properly. """ self.kgs_brf_installer.sig_kgs_brf_installed.disconnect() self.kgs_brf_installer = None def set_wldset(self, wldset): """Set the namespace for the wldset in the widget.""" self.wldset = wldset self.viewer.set_wldset(wldset) self.setEnabled(wldset is not None) if wldset is not None: date_start, date_end = self.set_datarange( self.wldset['Time'][[0, -1]]) self._datastart.setMinimumDate(date_start) self._dataend.setMaximumDate(date_end) def get_datarange(self): child = self while True: try: child.parent().raise_() except Exception: break else: child = child.parent() def set_datarange(self, times): date_start = xldate_as_tuple(times[0], 0) date_start = QDate(date_start[0], date_start[1], date_start[2]) self._datastart.setDate(date_start) date_end = xldate_as_tuple(times[1], 0) date_end = QDate(date_end[0], date_end[1], date_end[2]) self._dataend.setDate(date_end) return date_start, date_end def calc_brf(self): """Prepare the data, calcul the brf, and save and plot the results.""" # Prepare the datasets. well = self.wldset['Well'] t1 = min(self.brfperiod) i1 = np.where(self.wldset['Time'] >= t1)[0][0] t2 = max(self.brfperiod) i2 = np.where(self.wldset['Time'] <= t2)[0][-1] time = np.copy(self.wldset['Time'][i1:i2 + 1]) wl = np.copy(self.wldset['WL'][i1:i2 + 1]) bp = np.copy(self.wldset['BP'][i1:i2 + 1]) if len(bp) == 0: msg = ("The barometric response function cannot be computed" " because the currently selected water level dataset does" " not contain any barometric data for the selected period.") QMessageBox.warning(self, 'Warning', msg, QMessageBox.Ok) return et = np.copy(self.wldset['ET'][i1:i2 + 1]) if len(et) == 0: et = np.zeros(len(wl)) lagBP = self.lagBP lagET = self.lagET detrend = self.detrend correct = self.correct_WL # Fill the gaps in the dataset. dt = np.min(np.diff(time)) tc = np.arange(t1, t2 + dt / 2, dt) if len(tc) != len(time): print('Filling gaps in data with linear interpolation.') indx = np.where(~np.isnan(wl))[0] wl = np.interp(tc, time[indx], wl[indx]) indx = np.where(~np.isnan(bp))[0] bp = np.interp(tc, time[indx], bp[indx]) indx = np.where(~np.isnan(et))[0] et = np.interp(tc, time[indx], et[indx]) time = tc QApplication.setOverrideCursor(Qt.WaitCursor) print('calculating BRF') bm.produce_BRFInputtxt(well, time, wl, bp, et) msg = 'Not enough data. Try enlarging the selected period' msg += ' or reduce the number of BP and ET lags.' if lagBP >= len(time) or lagET >= len(time): QApplication.restoreOverrideCursor() QMessageBox.warning(self, 'Warning', msg, QMessageBox.Ok) return bm.produce_par_file(lagBP, lagET, detrend, correct) bm.run_kgsbrf() try: lag, A, err = bm.read_BRFOutput() date_start = self._datastart.date().getDate() date_end = self._dataend.date().getDate() self.wldset.save_brf(lag, A, err, date_start, date_end) self.viewer.new_brf_added() self.viewer.show() QApplication.restoreOverrideCursor() except Exception: QApplication.restoreOverrideCursor() QMessageBox.warning(self, 'Warning', msg, QMessageBox.Ok) return
class ImportWidget(QWidget): def __init__(self): super().__init__() self.init_gui() def read_sheet(self, file_data, sheet_name): self.model.clear() for row in file_data[sheet_name]: items = [QStandardItem(str(field)) for field in row] self.model.appendRow(items) def open_filename(self): filename = QFileDialog.getOpenFileName( self, self.tr("Abrir archivo"), "/home/luciano", self.tr("Hojas de Cálculo (*.ods)")) if filename[0] != "": self._enable_widgets(True) self.file_data = get_data(filename[0]) for key in self.file_data.keys(): self.cmb_ods_sheets.addItem(key) self.read_sheet(self.file_data, list(self.file_data.keys())[0]) def import_expenses(self): try: row = int(self.le_initial_row.text()) - 1 description_col = int(self.le_description_col.text()) - 1 date_col = int(self.le_date_col.text()) - 1 default_date = self.default_date.date() date_format = self.le_date_format.text() percent = 1.0 / len(list(self.current_group.getMembers())) while self.model.item(row) is not None: print("Row ", row) expense = Expense() expense.setDescription( self.model.item(row, description_col).text()) print("Expense: ", expense.getDescription()) date = QDate.fromString( self.model.item(row, date_col).text(), date_format) if not date.isValid(): date = default_date expense.setDate(date.toString(Qt.ISODate)) print("Date: ", expense.getDate()) cost = 0 users = [] for member in self.current_group.getMembers(): print("Processing member ", member.getFirstName()) member_column = int( self.member_widget_map[member.getId()].text()) - 1 paid = 0 try: paid = float( self.model.item(row, member_column).text()) print("Expense: ", self.model.item(row, member_column).text()) except: pass cost = cost + paid expense_user = ExpenseUser() expense_user.setId(member.getId()) expense_user.setPaidShare(str(paid)) users.append(expense_user) for expense_user in users: expense_user.setOwedShare(str(cost * percent)) if cost == 0: raise Exception( self.tr('No se ha introducido monto para el gasto')) expense.setCost(str(cost)) expense.setUsers(users) expense.setGroupId(self.current_group.id) self.sObj.createExpense(expense) row = row + 1 self.le_initial_row.setText(str(row + 1)) except Exception as inst: QMessageBox.critical( self, self.tr("Error"), self.tr("Se ha producido un error en la fila") + str(row + 1) + "\n" + str(inst)) traceback.print_exc() def _enable_widgets(self, state): self.le_initial_row.setEnabled(state) self.cmb_group.setEnabled(state) self.cmb_ods_sheets.setEnabled(state) self.le_date_col.setEnabled(state) self.default_date.setEnabled(state) self.le_description_col.setEnabled(state) self.btn_import.setEnabled(state) self.le_date_format.setEnabled(state) def sheet_changed(self, sheet_name): self.read_sheet(self.file_data, sheet_name) def current_group_changed(self, idx): item = self.vlayout.takeAt(1) item.layout().deleteLater() item.invalidate() item = None self.vlayout.invalidate() self.group_members_layout = QFormLayout() self.current_group = self.cmb_group.itemData(idx) column_number = 1 self.member_widget_map = {} for member in self.current_group.getMembers(): self.member_widget_map[member.getId()] = QLineEdit( str(column_number)) self.group_members_layout.addRow( self.tr("Columna " + member.getFirstName()), self.member_widget_map[member.getId()]) column_number = column_number + 1 self.vlayout.insertLayout(1, self.group_members_layout) def init_gui(self): self.form_layout = QFormLayout() self.cmb_ods_sheets = QComboBox() self.le_initial_row = QLineEdit("1") self.le_initial_row.setValidator(QIntValidator(1, 99999)) self.cmb_group = QComboBox() self.le_date_col = QLineEdit("1") self.le_date_col.setValidator(QIntValidator(1, 999999)) self.default_date = QDateTimeEdit(QDate.currentDate()) self.default_date.setMinimumDate(QDate.currentDate().addDays(-365)) self.default_date.setMaximumDate(QDate.currentDate().addDays(365)) self.default_date.setDisplayFormat("dd.MM.yyyy") self.default_date.setCalendarPopup(True) self.le_date_format = QLineEdit("d/M/yyyy") self.le_description_col = QLineEdit("2") self.le_description_col.setValidator(QIntValidator(1, 9999)) self.sObj = get_splitwise() groups = self.sObj.getGroups() self.cmb_ods_sheets.currentTextChanged.connect(self.sheet_changed) for group in groups: self.cmb_group.addItem(group.getName(), group) self.cmb_group.currentIndexChanged.connect(self.current_group_changed) self.cmb_group.setCurrentIndex(0) btn_open_filename = QPushButton("Open") btn_open_filename.clicked.connect(self.open_filename) self.form_layout.addRow(self.tr("Archivo"), btn_open_filename) self.form_layout.addRow(self.tr("Hoja"), self.cmb_ods_sheets) self.form_layout.addRow(self.tr("Grupos"), self.cmb_group) self.form_layout.addRow(self.tr("Fila Inicial"), self.le_initial_row) self.form_layout.addRow(self.tr("Columna Fecha"), self.le_date_col) self.form_layout.addRow(self.tr("Formato de fecha"), self.le_date_format) self.form_layout.addRow(self.tr("Fecha por defecto"), self.default_date) self.form_layout.addRow(self.tr("Columna Concepto"), self.le_description_col) self.group_members_layout = QFormLayout() self.btn_import = QPushButton(self.tr("Importar")) self.btn_import.clicked.connect(self.import_expenses) self.model = QStandardItemModel(self) tableView = QTableView(self) tableView.setModel(self.model) self.vlayout = QVBoxLayout() self.vlayout.addLayout(self.form_layout) self.vlayout.addLayout(self.group_members_layout) self.vlayout.addWidget(self.btn_import) self.vlayout.setStretch(1, 1) hlayout = QHBoxLayout() hlayout.addWidget(tableView) hlayout.addLayout(self.vlayout) hlayout.setStretch(1, 0) hlayout.setStretch(0, 1) self.setLayout(hlayout) self._enable_widgets(False) self.show()
class ri(QWidget): #日报table框组建 def __init__(self, config, parent=None): super(ri, self).__init__(parent) self.workThread = WorkThread() #多线程 self.workThread.sinOut.connect(self.setp) #多线程链接信号输出 layout = QGridLayout() #创建一个表格排列 self.sheetbox = QGroupBox("表名") self.sheetbox_lo = QGridLayout() self.sheetbox.setLayout(self.sheetbox_lo) self.rp_config = QGroupBox("日报配置") self.rp_config_lo = QGridLayout() self.rp_config.setLayout(self.rp_config_lo) layout.addWidget(self.sheetbox, 0, 0) layout.addWidget(self.rp_config, 1, 0) self.fileName1 = '' ###############第一行 文件选择框 ######## self.rp_config_lo.addWidget(QLabel('报表文件', self.rp_config), 0, 0) self.qtfile = QLineEdit('', self.rp_config) self.qtfile.insert(config['sheet_day']['filename'] if 'filename' in config['sheet_day'].keys() else '') self.qtfile.editingFinished.connect(self.creatsheetCheckBox) self.qbfile = QPushButton('选择文件', self.rp_config) self.qbfile.clicked.connect(self.button_click) self.qbfile.setEnabled(True) self.rp_config_lo.addWidget(self.qtfile, 0, 1, 1, 6) self.rp_config_lo.addWidget(self.qbfile, 0, 7) ######################第二行################################################ self.rp_config_lo.addWidget(QLabel('规则行', self.rp_config), 1, 0) self.gzh = QLineEdit('', self.rp_config) self.gzh.insert(config['sheet_day']['gzh']) self.gzh.setFixedWidth(40) self.rp_config_lo.addWidget(QLabel('时间列', self.rp_config), 1, 2) self.sjl = QLineEdit('', self.rp_config) self.sjl.insert(config['sheet_day']['sjl']) self.sjl.setFixedWidth(40) self.rp_config_lo.addWidget(QLabel('BMS厂家', self.rp_config), 1, 4) jslist = ['共济', '中联', '栅格'] self.jsComboBox = QComboBox(self.rp_config) #下拉菜单 for i in jslist: self.jsComboBox.addItem(i) self.jsComboBox.setCurrentIndex(int(config['sheet_day']['cj'])) self.rp_config_lo.addWidget(QLabel('模式', self.rp_config), 1, 6) jslist2 = ['0--寻找日期', '1--最后填充'] self.js2ComboBox = QComboBox(self.rp_config) #下拉菜单 for i in jslist2: self.js2ComboBox.addItem(i) self.js2ComboBox.setCurrentIndex(int(config['sheet_day']['mode'])) self.rp_config_lo.addWidget(self.gzh, 1, 1) self.rp_config_lo.addWidget(self.sjl, 1, 3) self.rp_config_lo.addWidget(self.jsComboBox, 1, 5) self.rp_config_lo.addWidget(self.js2ComboBox, 1, 7) ######################第三行时间选择行############################# self.rp_config_lo.addWidget(QLabel('起始时间', self.rp_config), 2, 0) self.dt1 = QDateTimeEdit(QDate.currentDate(), self.rp_config) # 创建日期,并初始值 self.dt1.setDisplayFormat('yyyy-MM-dd') #self.dt1.setMinimumDate(QDate.currentDate().addDays(-90)) # 限定时间最小值,当前时间-365天 self.dt1.setMaximumDate( QDate.currentDate().addDays(1)) # 限定时间最大值,当前时间+365天 self.dt1.setCalendarPopup( True) # 允许弹出窗口选择日期,setMinimumDate()的限定对这个窗口也有效 # #############结束时间选择 self.rp_config_lo.addWidget(QLabel('结束时间', self.rp_config), 2, 4) self.dt2 = QDateTimeEdit(QDate.currentDate(), self.rp_config) # 创建日期,并初始值 self.dt2.setDate(QDate.currentDate()) #self.dt2.setMinimumDate(QDate.currentDate().addDays(-90)) # 限定时间最小值,当前时间-365天 self.dt2.setMaximumDate( QDate.currentDate().addDays(1)) # 限定时间最大值,当前时间+365天 self.dt2.setCalendarPopup( True) # 允许弹出窗口选择日期,setMinimumDate()的限定对这个窗口也有效 ###########查询按钮########### self.qtb1 = QPushButton('查询', self.rp_config) self.qtb1.clicked.connect(self.work) self.rp_config_lo.addWidget(self.dt1, 2, 1, 1, 3) self.rp_config_lo.addWidget(self.dt2, 2, 5, 1, 2) self.rp_config_lo.addWidget(self.qtb1, 2, 7) #######第四行进度条 self.rp_config_lo.addWidget(QLabel('进度', self.rp_config), 3, 0) self.pbar = QProgressBar(self.rp_config) #self.pbar.setFixedWidth(560) self.rp_config_lo.addWidget(self.pbar, 3, 1, 1, 6) self.setLayout(layout) self.creatsheetCheckBox() def creatsheetCheckBox(self): qlist = self.sheetbox.findChildren((QCheckBox, QLabel)) #print(help(self.sheetbox_lo)) for i in qlist: self.sheetbox_lo.removeWidget(i) sip.delete(i) filename = str(self.qtfile.text()) if not path.exists(filename): self.sheetbox_lo.addWidget(QLabel('文件不存在', self.sheetbox), 0, 0) else: wb = load_workbook(filename) sheetname = wb.get_sheet_names() for index, i in enumerate(sheetname): lc[i] = QCheckBox(self.sheetbox) lc[i].setObjectName(i) lc[i].setText(i) lc[i].setStatusTip(i) lc[i].setChecked(True) a, b = divmod(index, 5) self.sheetbox_lo.addWidget(lc[i], a, b) gc.collect() def initserverinfo(self, host, port, user, passwd, db): self.workThread.init1(host, port, user, passwd, db) def setp(self, num): if num < 100: self.pbar.setValue(num) elif num == 1000: self.qtb1.setEnabled(True) self.pbar.setValue(0) self.workThread.quit() QMessageBox.information(self, "错误", "文件保存失败,检查文件是否被打开", QMessageBox.Yes) elif num == 2000: self.qtb1.setEnabled(True) self.pbar.setValue(0) #self.workThread.quit() QMessageBox.information(self, "错误", "无法导入pymysql依赖包", QMessageBox.Yes) elif num == 2001: self.qtb1.setEnabled(True) self.pbar.setValue(0) #self.workThread.quit() QMessageBox.information(self, "错误", "无法导入msmysql依赖包", QMessageBox.Yes) elif num >= 100 and num < 101: self.qtb1.setEnabled(True) self.pbar.setValue(num) QMessageBox.information(self, "提示", "报表导出成功1", QMessageBox.Yes) def work(self): self.t1 = time.mktime( time.strptime(self.dt1.date().toString(Qt.ISODate), "%Y-%m-%d")) self.t2 = time.mktime( time.strptime(self.dt2.date().toString(Qt.ISODate), "%Y-%m-%d")) + 60 * 60 * 24 c_cheetname = [] for i in self.sheetbox.findChildren(QCheckBox): if i.isChecked(): c_cheetname.append(i.statusTip()) if time.mktime( time.strptime(self.dt1.date().toString( Qt.ISODate), "%Y-%m-%d")) > time.mktime( time.strptime(self.dt2.date().toString(Qt.ISODate), "%Y-%m-%d")): QMessageBox.information(self, "信息", "起始时间不能大于结束时间", QMessageBox.Yes) else: gzh = self.gzh.text() sjl = self.sjl.text() cj = self.jsComboBox.currentText() self.fileName1 = self.qtfile.text() mode = int(self.js2ComboBox.currentText().split('--')[0]) if not path.exists(self.fileName1): QMessageBox.information(self, "提示", "检查配置,找不到模板文件", QMessageBox.No) elif len(c_cheetname) == 0: QMessageBox.information(self, "提示", "没有选中任何工作表", QMessageBox.No) else: self.qtb1.setEnabled(False) self.workThread.init2(self.fileName1, self.t1, self.t2, gzh, sjl, cj, mode, c_cheetname) self.workThread.start() #计时开始 #self.workThread.trigger.connect(over) #当获得循环完毕的信号时,停止计数 def button_click(self): # absolute_path is a QString object self.fileName1, self.filetype = QFileDialog.getOpenFileName( self, "选取文件", "", "xlsx (*.xlsx)") #设置文件扩展名过滤,注意用双分号间隔 if self.fileName1 == '': pass else: self.qtfile.clear() self.qtfile.insert(self.fileName1) self.creatsheetCheckBox()
class ShowInfoWidget(object): def setupUi(self, Form): Form.setObjectName("Form") Form.resize(1050, 650) self.gridLayoutWidget = QtWidgets.QWidget(Form) self.gridLayoutWidget.setGeometry(QtCore.QRect(29, 9, 1000, 600)) self.gridLayoutWidget.setObjectName("gridLayoutWidget") #网格布局 self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget) self.gridLayout.setContentsMargins(0, 0, 0, 0) self.gridLayout.setHorizontalSpacing(20) self.gridLayout.setObjectName("gridLayout") # 日期选择框 self.dateEdit = QDateTimeEdit(QDateTime.currentDateTime(), self.gridLayoutWidget) self.dateEdit.setObjectName("dateEdit") self.dateEdit.setDisplayFormat("yyyy-MM-dd") self.dateEdit.setMinimumDate(QDate.currentDate().addDays(-365)) self.dateEdit.setMaximumDate(QDate.currentDate().addDays(365 * 3)) self.dateEdit.setCalendarPopup(True) self.gridLayout.addWidget(self.dateEdit, 1, 0, 1, 1) #下拉列表 self.comboBox = QtWidgets.QComboBox(self.gridLayoutWidget) self.comboBox.setObjectName("comboBox") num = self.getLogsItems() self.comboBox.setMaxVisibleItems(num) self.gridLayout.addWidget(self.comboBox, 2, 0, 1, 1) #日志显示框 self.textEdit = QtWidgets.QTextEdit(self.gridLayoutWidget) self.textEdit.setObjectName("textEdit") self.gridLayout.addWidget(self.textEdit, 3, 0, 1, 1) self.textEdit.setReadOnly(True) #按钮 self.pushButton = QtWidgets.QPushButton(self.gridLayoutWidget) self.pushButton.setObjectName("pushButton") self.gridLayout.addWidget(self.pushButton, 2, 1, 1, 1) self.bindButton() self.retranslateUi(Form) QtCore.QMetaObject.connectSlotsByName(Form) def retranslateUi(self, Form): _translate = QtCore.QCoreApplication.translate Form.setWindowTitle(_translate("Form", "系统日志查询")) self.pushButton.setText(_translate("Form", "显示日志")) def bindButton(self): self.pushButton.clicked.connect(lambda: self.showFileButtonClicked()) self.dateEdit.dateTimeChanged.connect(lambda: self.getLogsItems()) #显示日志按钮点击事件 def showFileButtonClicked(self): self.textEdit.clear() path = os.path.abspath(os.getcwd()) filename = self.comboBox.currentText() if not filename: self.textEdit.append("这一天没有产生日志") return filepath = path + "/logs/" + filename try: with open(filepath, "r", encoding='utf-8') as f: count = 1 data = f.readline() while data: if data: datalist = data.split("-", 4) self.textEdit.append("第" + str(count) + "条日志:" + datalist[1] + "/" + datalist[2] + datalist[4]) count = count + 1 data = f.readline() else: self.textEdit.append(filename + "文件为空") except FileNotFoundError: self.textEdit.append("找不到" + filename + "文件") #获取要显示在下拉框中的日志文件名 def getLogsItems(self): path = str(os.path.abspath(os.getcwd())) + "/logs" data = self.getChoisedTimeInfoFileData() for root, dirs, files in os.walk(path): self.comboBox.clear() for i in files: fileNameList = i.split("-") filename = fileNameList[0] + "-" + fileNameList[ 1] + "-" + fileNameList[2] if filename == data: self.comboBox.addItem(i) return len(files) #获取当前选择的日期的文件日期 def getChoisedTimeInfoFileData(self): date = self.dateEdit.text() return str(date)
class Page3Win(QWidget): def __init__(self, parent=None): super(Page3Win, self).__init__(parent) self.conditionBox() self.resultTable() mainLayout = QVBoxLayout() mainLayout.addWidget(self.setConditGroup) mainLayout.addWidget(self.table) mainLayout.addSpacing(12) mainLayout.addStretch(1) self.setLayout(mainLayout) def conditionBox(self): self.typeChkBoxGroup() ##查找条件设定Box self.setConditGroup = QGroupBox("查找条件") grid = QGridLayout() #COL1 nameLabel = QLabel("样品姓名:") idLabel = QLabel("样品ID") companyLabel = QLabel("来源公司") typeLabel = QLabel("产品类型") time1Label = QLabel("起始时间") time2Label = QLabel("结束时间") #COL2 nameEdit = QLineEdit() idEdit = QLineEdit() companyEdit = QLineEdit() self.dateEdit1 = QDateTimeEdit(QDate.currentDate()) self.dateEdit1.setCalendarPopup(True) self.dateEdit2 = QDateTimeEdit(QDate.currentDate()) self.dateEdit2.setCalendarPopup(True) self.dateEdit2.setMaximumDate(QDate.currentDate().addDays(200)) #COL3 nameNote = QLabel("支持输入多姓名查找,姓名之间使用','或'/'间隔") idNote = QLabel("支持输入多id查找,id之间使用','或'/'间隔") companyNote = QLabel("请输入样品来源公司的中文名称,支持模糊匹配") grid.addWidget(nameLabel, 0, 0) grid.addWidget(idLabel, 1, 0) grid.addWidget(companyLabel, 2, 0) grid.addWidget(typeLabel, 3, 0) grid.addWidget(time1Label, 4, 0) grid.addWidget(time2Label, 5, 0) grid.addWidget(nameEdit, 0, 1) grid.addWidget(idEdit, 1, 1) grid.addWidget(companyEdit, 2, 1) grid.addWidget(self.typeGroupBox, 3, 1) grid.addWidget(self.dateEdit1, 4, 1) grid.addWidget(self.dateEdit2, 5, 1) grid.addWidget(nameNote, 0, 2) grid.addWidget(idNote, 1, 2) grid.addWidget(companyNote, 2, 2) self.setConditGroup.setLayout(grid) def resultTable(self): self.table = QTableWidget() self.table.setColumnCount(2) self.table.setRowCount(2) self.table.setVerticalHeaderLabels(["报告数", "样品ID"]) self.table.setHorizontalHeaderLabels(["常规项目", "9800"]) self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) #self.table.setSelectionBehavior(QAbstractItemView.SelectColumns) def typeChkBoxGroup(self): ##用于产品类型的ChkBox self.typeGroupBox = QGroupBox() self.typeGroupBox.setMaximumSize(500, 40) layout = QHBoxLayout() CheckBox_cg = QCheckBox("常规项目") CheckBox_9800 = QCheckBox("9800项目") layout.addWidget(CheckBox_cg) layout.addWidget(CheckBox_9800) self.typeGroupBox.setLayout(layout)