import os import sys import time from PyQt5.QtGui import QFont, QPixmap, QIcon from PyQt5.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QListWidget, QLabel, QMenu, QAction, QDialog, QLineEdit, QPushButton) from PyQt5.QtCore import Qt, pyqtSignal from utils.BasicUtils import (load_myday_important, remove_todo_list, change_value, get_todo, get_myday_important_conf, change_myday_important_conf) from utils.CreateToDo import CreateToDo from view.AddToDoLabel import AddToDoAction from view.ToDoItem import ToDoItem class Important(QWidget): # 更新信号,在删除时触发 update_signal = pyqtSignal() signal = pyqtSignal() def __init__(self): super(Important, self).__init__() self.setObjectName('important') self.setAttribute(Qt.WA_StyledBackground) background = get_myday_important_conf('Important', 'Theme') if not background: background = '8' self.setStyleSheet('#important{background-image:url("../images/' + background + '.jpg");border-radius: 10px;}') # 布局样式:最外面一个大的垂直布局,里面的最上面标题是一个水平布局,水平布局显示的是一个垂直布局和一个右边的选项,用来更换背景 # 布局样式:继承QWidget,里面一个垂直布局,最上面一个QWidget用来设置头部布局 # 头部QWidget里面一个水平布局,水平布局里面一个QWidget(方便设置整体位置),然后是一个 layout = QVBoxLayout() head_layout = QHBoxLayout() head_widget = QWidget(self) self.todo_list = QListWidget() # 关闭滚动条 self.todo_list.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.todo_list.setObjectName('todo_list') # 添加ToDo的标签 self.add_todo = AddToDoAction() self.add_todo.line_edit.returnPressed.connect(lambda: self.line_edit_add(self.add_todo.line_edit.text())) self.add_todo.setAlignment(Qt.AlignCenter) head_widget.setAttribute(Qt.WA_StyledBackground) head_widget.setLayout(head_layout) head_layout.setAlignment(Qt.AlignCenter) layout.addWidget(head_widget, 2, Qt.AlignTop) layout.addWidget(self.todo_list, 6, Qt.AlignCenter | Qt.AlignTop) head_label = QLabel("重要") head_label.setObjectName('head_label') font = QFont() font.setPointSize(32) head_label.setFont(font) layout.addStretch(1) head_layout.addWidget(head_label, 8) layout.addStretch(1) layout.addWidget(self.add_todo, 2, Qt.AlignHCenter) self.menu_image = QPushButton() self.menu_image.setObjectName('menu_image') self.menu_image.setFixedSize(30, 30) # self.menu_image.setScaledContents(True) pic_btn = QPixmap(os.getcwd() + "/../images/menu.png") self.menu_image.setIcon(QIcon(pic_btn)) head_layout.addWidget(self.menu_image, 2) head_layout.addStretch(1) self.setLayout(layout) # self.menu_image.clicked.connect(self.menu_action) self.button_menu = QMenu(self) # 背景透明 self.button_menu.setAttribute(Qt.WA_TranslucentBackground) # 无边框、去掉自带阴影 self.button_menu.setWindowFlags( self.button_menu.windowFlags() | Qt.FramelessWindowHint | Qt.NoDropShadowWindowHint) self.menu_image.setMenu(self.button_menu) refresh_label = QAction(self) refresh_label.setText('刷新') refresh_label.setIcon(QIcon('../images/refresh.svg')) # refresh_label.setDisabled(True) self.button_menu.addAction(refresh_label) self.button_menu.addSeparator() refresh_label.triggered.connect(self.refresh_action) theme_label = QAction(self) theme_label.setText('主题') theme_label.setDisabled(True) self.button_menu.addAction(theme_label) self.button_menu.addSeparator() label_action1 = QAction(self) label_action1.setIcon(QIcon('../images/1.jpg')) label_action1.setText('背景1') label_action1.triggered.connect(lambda: self.menu_action(1)) self.button_menu.addAction(label_action1) label_action2 = QAction(self) label_action2.setIcon(QIcon('../images/2.jpg')) label_action2.setText('背景2') label_action2.triggered.connect(lambda: self.menu_action(2)) self.button_menu.addAction(label_action2) label_action3 = QAction(self) label_action3.setIcon(QIcon('../images/3.jpg')) label_action3.setText('背景3') label_action3.triggered.connect(lambda: self.menu_action(3)) self.button_menu.addAction(label_action3) label_action4 = QAction(self) label_action4.setIcon(QIcon('../images/4.jpg')) label_action4.setText('背景4') label_action4.triggered.connect(lambda: self.menu_action(4)) self.button_menu.addAction(label_action4) label_action5 = QAction(self) label_action5.setIcon(QIcon('../images/5.jpg')) label_action5.setText('背景5') label_action5.triggered.connect(lambda: self.menu_action(5)) self.button_menu.addAction(label_action5) # 右键菜单 self.todo_list.setContextMenuPolicy(Qt.CustomContextMenu) self.todo_list.customContextMenuRequested.connect(self.todo_list_context) # todolist = ToDoList() self.refresh_action() def refresh_action(self): # self.my_day_list[] self.todo_list.clear() # print(self.my_day_list) my_day_list = load_myday_important('Important') if my_day_list: for my_day in my_day_list: self.load_important(my_day[0], my_day[1]) def load_important(self, name, uid): todo_item = ToDoItem(name, uid) todo_item.mark_icon.clicked.connect(lambda: self.mark_done(uid)) todo_item.important_button.clicked.connect(lambda: self.mark_important(uid)) self.todo_list.addItem(todo_item) self.todo_list.setItemWidget(todo_item, todo_item.widget) def menu_action(self, count): # 点击按钮 count = str(count) change_myday_important_conf('Important', 'theme', count) # self.menu_label = ChangeTheme() self.setStyleSheet('#important{background-image:url("../images/' + count + '.jpg");' 'background-position: center; border-radius: 10px;' '}') # print('选中:' + count) def line_edit_add(self, name): if name: self.add_todo.todo_name.emit(name) # print('添加的新ToDo:' + name) create_todo = CreateToDo('Todo', name) change_value(create_todo, 'isImportant', True) todo_item = ToDoItem(name, create_todo) self.todo_list.addItem(todo_item) self.todo_list.setItemWidget(todo_item, todo_item.widget) self.add_todo.line_edit.clear() self.update_signal.emit() def todo_list_context(self, position): # 设置右键菜单 pop_menu = QMenu(self) pop_menu.setObjectName('lift_menu') pop_menu.setAttribute(Qt.WA_TranslucentBackground) # 无边框、去掉自带阴影 pop_menu.setWindowFlags( pop_menu.windowFlags() | Qt.FramelessWindowHint | Qt.NoDropShadowWindowHint) rename_action = QAction(u'重命名', self) mark_myday = QAction(QIcon(QPixmap(os.getcwd() + '/../images/make_sun.svg')), u"设置为我的一天", self) mark_important = QAction(QIcon(QPixmap(os.getcwd() + '/../images/star.svg')), u"取消设置为重要", self) del_action = QAction("删除", self) # 查看右键时是否在item上面,如果不在.就不显示删除和修改. if self.todo_list.itemAt(position): pop_menu.addAction(mark_myday) pop_menu.addAction(mark_important) pop_menu.addAction(del_action) pop_menu.addAction(rename_action) mark_myday.triggered.connect(lambda: self.make_action('MyDay')) rename_action.triggered.connect(self.rename_item) # copy_action.triggered.connect(self.create_item) del_action.triggered.connect(self.delete_item) mark_important.triggered.connect(lambda: self.make_action('Important')) pop_menu.exec_(self.todo_list.mapToGlobal(position)) def make_action(self, make_type): # print(self.todo_list.currentRow()) load_todo = load_myday_important('Important') print(load_todo) uid = load_todo[self.todo_list.currentRow()][1] if make_type == 'MyDay': change_value(uid, 'isMyDay', True) elif make_type == 'Important': change_value(uid, 'isImportant', False) self.todo_list.takeItem(self.todo_list.currentRow()) self.refresh_action() self.update_signal.emit() # 删除分组 def delete_item(self): # print(self.load_list[self.system_listWidget.currentRow() - 2][1]) my_day_list = load_myday_important('Important') # load_todo = get_todo(my_day_list[self.todo_list.currentRow()][1]) uid = my_day_list[self.todo_list.currentRow()][1] remove_todo_list(uid) # change_value(uid,'isImportant',False) self.todo_list.takeItem(self.todo_list.currentRow()) self.update_signal.emit() # 重命名分组 def rename_item(self): # curRow = self.todo_list.currentRow() # item = self.todo_list.item(curRow) self.dialog = QDialog() self.dialog.setWindowTitle('重命名') self.dialog_layout = QVBoxLayout() self.dialog.resize(300, 200) self.dialog.setLayout(self.dialog_layout) line_edit = QLineEdit() # line_edit.setObjectName('rename_line') line_edit.setStyleSheet('border: 1px solid;background:transparent;min-width:400px;') line_edit.setPlaceholderText('请输入新的名字') self.dialog_layout.addWidget(line_edit) confirm_button = QPushButton('确认修改') self.dialog_layout.addWidget(confirm_button) confirm_button.setStyleSheet('background-color:#bcbcbc;border-radius:5px;') confirm_button.clicked.connect(lambda: self.change_name(line_edit.text())) self.dialog.exec_() def change_name(self, item_name): # print(item_name) if item_name: my_day_list = load_myday_important('Important') change_value(my_day_list[self.todo_list.currentRow()][1], 'title', item_name) # 重命名发送信号 self.refresh_action() self.update_signal.emit() self.dialog.close() def mark_done(self, uid): # print('mark done:', uid) change_value(uid, 'done', True) # time.sleep(0.5) self.todo_list.takeItem(self.todo_list.currentRow()) self.refresh_action() self.update_signal.emit() def mark_important(self, uid): change_value(uid, 'isImportant', False) # print('mark important:', uid) self.refresh_action() self.update_signal.emit()