class FourthMode(MiddleWidget): def __init__(self, obj, name): super().__init__(obj, name) self._thread = None self._obj = obj self.name = name self.row = 2 self.set_up() def set_up(self): middle_widget = QWidget() self.middle_layout = QGridLayout() middle_widget.setLayout(self.middle_layout) for i in range(self.row): middle_icon = QLabel(chr(0xf002) + f'目录_{i}:') middle_icon.setFont(qtawesome.font('fa', 12)) middle_icon.setFixedSize(50, self.height) middle_input = QLineEdit() middle_input.setFixedHeight(self.height) middle_input.setObjectName(f'middle_input_{i}') middle_btn = QPushButton("…") middle_btn.setFixedSize(50, self.height) middle_btn.setObjectName(f'middle_btn_{i}') middle_btn.setToolTip('点击选择文件') middle_btn.clicked.connect(lambda: self.open_file(middle_widget)) self.middle_layout.addWidget(middle_icon, i, 0, 1, 1) self.middle_layout.addWidget(middle_input, i, 1, 1, self.row - 1) self.middle_layout.addWidget(middle_btn, i, self.row, 1, 1) middle_icon = QLabel(chr(0xf002) + f'目录_{i}:') middle_icon.setFont(qtawesome.font('fa', 12)) middle_icon.setFixedSize(50, self.height) self.middle_time = QLineEdit() self.middle_time.setFixedHeight(self.height) self.middle_time.setObjectName(f'middle_input_{i}') btn = QPushButton("选择日期") btn.clicked.connect(self.openCalendar) self.cal = QCalendarWidget() self.cal.setGridVisible(True) # 是否显示日期之间的网格 self.cal.setFixedSize(250, 200) self.cal.hide() # 隐藏日期控件 self.cal.clicked[QDate].connect( self.showDate) # clicked[参数],即定义showDate是传入的参数类型设置 self.middle_layout.addWidget(middle_icon, 2, 0, 1, 1) self.middle_layout.addWidget(self.middle_time, 2, 1, 1, self.row - 1) self.middle_layout.addWidget(btn, 2, self.row, 1, 1) self.middle_layout.addWidget(self.cal, 3, 1, 1, 1) self.middle_layout.setAlignment(Qt.AlignTop) self._obj.mid_layout.addWidget(middle_widget, 0, 0, 1, 1) set_first_mode_style(middle_widget) return True def showDate(self, date): self.middle_time.setText(date.toString("yyyy-MM-dd dddd")) self.cal.close() # 关闭日期控件 def openCalendar(self): self.cal.show() # 显示日期控件 def get_data(self): self.children = self.middle_layout.count() print(self.children) keys = [ self.middle_layout.itemAt(i).widget().text() for i in range(self.children) if not (i % 3) ] values = [ self.middle_layout.itemAt(i).widget().text() for i in range(self.children) if i % 3 == 1 ] for i in range(self.children // 3): input_val = values[i].strip() if not input_val: continue elif not os.path.exists(input_val): print("file path error") return else: self.data[keys[i]] = input_val return True def set_widget_enable(self, flag=False): # 禁止btn等 if flag: self.reset_progress() else: self._obj.tail_btn.setEnabled(True) for widget in (self.middle_layout.itemAt(i).widget() for i in range(self.children) if i % 3): widget.setDisabled(flag) def run(self): if not self.get_data(): raise GetDataError("获取页面路径错误") if not self.data: print("界面参数不能为空") return try: self.create_thread_run() except: self.set_widget_enable() traceback.print_exc() def create_thread_run(self): self._thread = MyThread() self._thread.sig_str.connect(self.output_log_info) self._thread.sig_int.connect(self.set_progress) # self._thread.get_data(self.data) self._thread.get_obj(self) # 线程启动时禁止button和重置进度条 # 运行后控件禁止再点击 self.set_widget_enable(True) self._thread.start()
class ToDoWindow(QWidget): def __init__(self, db_accessor): super().__init__() self.db_accessor = db_accessor # database delegate self.init_ui() def init_ui(self): self.hBox = QHBoxLayout() self.hBox2 = QHBoxLayout() self.vBox = QVBoxLayout() self.removeBtn = QPushButton() self.removeBtn.setText("Remove Selected Tasks") self.removeBtn.clicked[bool].connect(self.remove_task) self.createBtn = QPushButton() self.createBtn.setText("Create Task") self.createBtn.setFixedSize(200, 50) self.createBtn.clicked[bool].connect(self.create_task) self.nameBox = QLineEdit() self.nameBox.setPlaceholderText("Task Name") self.nameBox.setMaxLength(50) self.nameBox.setFixedSize(1185, 50) self.descBox = QTextEdit() self.descBox.setPlaceholderText("Task Description") self.descBox.setFixedSize(600, 500) self.calendar = QCalendarWidget() self.calendar.setFixedSize(775, 500) self.table = QTableView() self.table.setFixedSize(1400, 400) # stretch columns to fill table's width and load data from database into table self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) self.update_task_view(self.db_accessor.get_tasks()) # add widgets to appropriate horizontal layouts self.hBox.addWidget(self.createBtn) self.hBox.addWidget(self.nameBox) self.hBox2.addWidget(self.descBox) self.hBox2.addWidget(self.calendar) # add horizontal layouts to vertical layout # add remove button and table to vertical layout self.vBox.addLayout(self.hBox) self.vBox.addLayout(self.hBox2) self.vBox.addWidget(self.removeBtn) self.vBox.addWidget(self.table) # Create and display window self.setLayout(self.vBox) self.setWindowTitle('To-Do') self.show() # insert a new task into the database and refresh table to reflect insertion def create_task(self): name = self.nameBox.text().replace("'", "\\'") description = self.descBox.toPlainText().replace("'", "\\'") date = self.calendar.selectedDate().toString("yyyy-MM-dd") self.db_accessor.insert_new_task(name, description, date) self.update_task_view(self.db_accessor.get_tasks()) # refresh table def update_task_view(self, result_set): model = QStandardItemModel() list_of_entries = [list(map(str, elem)) for elem in result_set] model.setHorizontalHeaderLabels(self.db_accessor.get_column_names()) res_rows = list_of_entries for row in res_rows: model.appendRow(self.get_items_row(row)) self.table.setModel(model) self.table.resizeRowsToContents() self.nameBox.setText("") self.descBox.setText("") self.calendar.setSelectedDate(QDate.currentDate()) # set the values from the result set into a new row in the model format def get_items_row(self, result_row): item_row = [] for val in result_row: item = QStandardItem(val) item.setEditable(False) item_row.append(item) return item_row def remove_task(self): model = self.table.model() # get the indeces of the currently selected rows indices = [ elem.row() for elem in self.table.selectionModel().selectedRows() ] # remove the tasks from the database and refresh table to reflect deletion for index in indices: name = model.data(model.index(index, 0)).replace("'", "\\'") description = model.data(model.index(index, 1)).replace("'", "\\'") date = model.data(model.index(index, 2)) self.db_accessor.delete_task(name, description, date) self.update_task_view(self.db_accessor.get_tasks())
class DateInputW(QFrame): def __init__(self, parent): super(DateInputW, self).__init__() self.layout = QGridLayout() self.parent = parent self.title1 = QLabel(u'Начало:', self) self.title1.move(5, 5) self.cal1 = QCalendarWidget() self.cal1.setGridVisible(True) self.cal1.setDateEditEnabled(True) self.cal1.clicked.connect(self.setDateStart) self.cal1.setFixedSize(200, 160) ymd1 = [parent.day_start.year, parent.day_start.month, parent.day_start.day] qdate1 = QDate() qdate1.setDate(ymd1[0], ymd1[1], ymd1[2]) self.cal1.setSelectedDate(qdate1) self.lbl1 = QLabel(self) self.lbl1.setText(parent.day_start.strftime('%d/%m/%Y')) self.lbl1.move(5, 25) self.title2 = QLabel(u'Конец:', self) self.title2.move(325, 5) self.cal2 = QCalendarWidget() self.cal2.setGridVisible(True) self.cal2.setDateEditEnabled(True) self.cal2.clicked.connect(self.setDateEnd) self.cal2.setFixedSize(200, 160) ymd2 = [parent.day_end.year, parent.day_end.month, parent.day_end.day] qdate2 = QDate() qdate2.setDate(ymd2[0], ymd2[1], ymd2[2]) self.cal2.setSelectedDate(qdate2) self.lbl2 = QLabel(self) self.lbl2.setText(parent.day_end.strftime('%d/%m/%Y')) self.lbl2.move(325, 25) self.layout.addWidget(self.cal1, 1, 0) self.layout.addWidget(self.cal2, 1, 1) self.setAutoFillBackground(True) palette = self.palette() palette.setColor(self.backgroundRole(), QColor('white')) self.setPalette(palette) self.setFrameShape(_frameShape) self.setFrameShadow(_frameShadow) self.setLineWidth(_lineWidth) self.setMidLineWidth(_midLineWidth) #change NavBar background color child = self.cal1.children()[3] palette = child.palette() palette.setColor(child.backgroundRole(), QColor('silver')) child.setPalette(palette) child = self.cal2.children()[3] palette = child.palette() palette.setColor(child.backgroundRole(), QColor('silver')) child.setPalette(palette) # change cell color brush = self.cal1.paintCell #self.cal1.setWeekdayTextFormat(headerForm) #parent.layout.addLayout(self.layout, 1, 0, 1, 2) def setDateStart(self): date = self.cal1.selectedDate() date = date.toPyDate() self.parent.day_start = datetime.datetime(date.year, date.month, date.day) self.lbl1.setText(self.parent.day_start.strftime('%d/%m/%Y')) minDate_dt = self.parent.day_start + datetime.timedelta(days=1) minDate = QDate() minDate.setDate(minDate_dt.year, minDate_dt.month, minDate_dt.day) self.cal2.setMinimumDate(minDate) def setDateEnd(self): date = self.cal2.selectedDate() date = date.toPyDate() self.parent.day_end = datetime.datetime(date.year, date.month, date.day) self.lbl2.setText(self.parent.day_end.strftime('%d/%m/%Y')) maxDate_dt = self.parent.day_end - datetime.timedelta(days=1) maxDate = QDate() maxDate.setDate(maxDate_dt.year, maxDate_dt.month, maxDate_dt.day) self.cal1.setMaximumDate(maxDate)