import os import sys from PyQt5.QtGui import * from PyQt5.QtWidgets import * from PyQt5.QtCore import Qt, pyqtSignal import configparser from utils.BasicUtils import get_todo_list, remove_todo_list, change_value from utils.CreateToDo import CreateToDo from utils.QSSLoader import QSSLoader from view.ImportantView import Important from view.MyListWidget import MyListWidget from view.ToDoListView import ToDoList from view.UserLabel import User from view.SelfListWidgetItem import SelfListWidgetItem from view.AddListLabel import AddListAction from view.MyDayView import MyDay class MainWidget(QWidget): update_signal = pyqtSignal() def __init__(self): super(MainWidget, self).__init__() self.user_label = User() # 主布局,左右两侧 layout = QHBoxLayout() # 子布局,左边的部分 self.sub_layout = QVBoxLayout() self.sub_layout.spacing() self.sub_layout.addWidget(self.user_label, 2) # 左侧列表 self.system_listWidget = MyListWidget(self) self.system_listWidget.setFrameShape(QListWidget.NoFrame) self.sub_layout.addWidget(self.system_listWidget, 15) # 添加最下边的QLabel self.add_list_action = AddListAction() self.add_list_action.create_todo_list.connect(self.create_item) # self.add_item_label.setPixmap(QPixmap()) self.sub_layout.addWidget(self.add_list_action, 1) # 禁止双击可编辑 self.system_listWidget.setEditTriggers(QAbstractItemView.NoEditTriggers) # 右键菜单 self.system_listWidget.setContextMenuPolicy(Qt.CustomContextMenu) self.system_listWidget.setObjectName('custom') self.system_listWidget.customContextMenuRequested.connect(self.myListWidgetContext) # 右侧层叠窗口 self.my_day = MyDay() self.important = Important() self.stackedWidget = QStackedWidget(self) self.stackedWidget.addWidget(self.my_day) self.stackedWidget.addWidget(self.important) layout.addLayout(self.sub_layout, 2) layout.addWidget(self.stackedWidget, 6) self.system_listWidget.currentRowChanged.connect(self.stackedWidget.setCurrentIndex) self.setLayout(layout) self.initUI() def initUI(self): # 先清除列表,方便后面调用 self.system_listWidget.clear() # 系统默认的两个 item self.one_day = SelfListWidgetItem('我的一天', 0, None, os.getcwd() + '/../images/sun.svg') self.system_listWidget.setCurrentRow(1) # self.one_day.setSelected(True) self.important_item = SelfListWidgetItem('重要', 0, None, os.getcwd() + '/../images/star.svg') self.system_listWidget.addItem(self.one_day) self.system_listWidget.setItemWidget(self.one_day, self.one_day.widget) self.system_listWidget.addItem(self.important_item) self.system_listWidget.setItemWidget(self.important_item, self.important_item.widget) # todo : 通过信号修改显示的标题名字 # self.system_listWidget.change_list_name.connect(self.change_list) # 加载列表 load_list = get_todo_list() # print(load_list) if load_list: for load in load_list: self.load_item(load[0], load[1], load[3]) # self.system_listWidget.addScrollBarWidget(False) # todo 仔细研究右键菜单 def myListWidgetContext(self, position): if self.system_listWidget.currentRow() > 1: # 设置右键菜单 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) # copy_action = QAction("复制分组", self) del_action = QAction("删除分组", self) change_icon = QMenu('修改图标', pop_menu) # 背景透明 change_icon.setAttribute(Qt.WA_TranslucentBackground) # 无边框、去掉自带阴影 change_icon.setWindowFlags( change_icon.windowFlags() | Qt.FramelessWindowHint | Qt.NoDropShadowWindowHint) # 二级菜单 action1 = QAction(QIcon(os.getcwd() + '/../images/icon/星宿.svg'), "星宿", self) action2 = QAction(QIcon(os.getcwd() + '/../images/icon/度假.svg'), "度假", self) action3 = QAction(QIcon(os.getcwd() + '/../images/icon/冰淇淋.svg'), "冰淇淋", self) action4 = QAction(QIcon(os.getcwd() + '/../images/icon/学习.svg'), "学习", self) action5 = QAction(QIcon(os.getcwd() + '/../images/icon/工作.svg'), "工作", self) action6 = QAction(QIcon(os.getcwd() + '/../images/icon/购物.svg'), "购物", self) change_icon.addAction(action1) change_icon.addAction(action2) change_icon.addAction(action3) change_icon.addAction(action4) change_icon.addAction(action5) change_icon.addAction(action6) action1.triggered.connect(lambda: self.change_icon('星宿')) action2.triggered.connect(lambda: self.change_icon('度假')) action3.triggered.connect(lambda: self.change_icon('冰淇淋')) action4.triggered.connect(lambda: self.change_icon('学习')) action5.triggered.connect(lambda: self.change_icon('工作')) action6.triggered.connect(lambda: self.change_icon('购物')) # 查看右键时是否在item上面,如果不在.就不显示删除和修改. if self.system_listWidget.itemAt(position): pop_menu.addAction(del_action) pop_menu.addAction(rename_action) # pop_menu.addAction(change_icon) pop_menu.addMenu(change_icon) rename_action.triggered.connect(self.rename_item) # copy_action.triggered.connect(self.create_item) del_action.triggered.connect(self.delete_item) pop_menu.exec_(self.system_listWidget.mapToGlobal(position)) def change_icon(self, icon): # print(icon) load_list = get_todo_list() change_value(load_list[self.system_listWidget.currentRow() - 2][1], 'icon', icon) self.initUI() # 加载左侧列表 def load_item(self, list_name, uid, icon=None): # print(icon) # self.stackedWidget.currentChanged.connect(self.change) item = SelfListWidgetItem(list_name, 0, uid, os.getcwd() + '/../images/icon/' + icon + '.svg') item.setTextAlignment(Qt.AlignCenter) # 使得item是可以编辑的. item.setFlags(item.flags() | Qt.ItemIsEditable) self.system_listWidget.addItem(item) todo_list = ToDoList(list_name, uid) # 信号测试成功!! # 更新 重要 内容 todo_list.update_signal.connect(self.important.refresh_action) todo_list.update_signal.connect(self.my_day.refresh_action) # 删除分组时可用 self.important.update_signal.connect(todo_list.refresh_action) self.important.update_signal.connect(self.my_day.refresh_action) self.my_day.update_signal.connect(todo_list.refresh_action) self.my_day.update_signal.connect(self.important.refresh_action) self.update_signal.connect(todo_list.refresh_action) # 创建后就可以编辑item,用户自己起名字. # self.system_listWidget.editItem(item) self.stackedWidget.addWidget(todo_list) self.system_listWidget.setItemWidget(item, item.widget) def change(self): print(1) # 点击创建新的分组 def create_item(self, new_list='新建列表', uid=None): # 创建一个没有名字的item # new_list = '新建列表' if not uid: create_todo_uid = CreateToDo('ToDoList', new_list) item = SelfListWidgetItem(new_list, 0, create_todo_uid) item.setTextAlignment(Qt.AlignCenter) # 使得item是可以编辑的. item.setFlags(item.flags() | Qt.ItemIsEditable) self.system_listWidget.addItem(item) todo_list = ToDoList(new_list, create_todo_uid) self.stackedWidget.addWidget(todo_list) self.system_listWidget.setItemWidget(item, item.widget) # 删除分组 def delete_item(self): # print(self.load_list[self.system_listWidget.currentRow() - 2][1]) load_list = get_todo_list() remove_todo_list(load_list[self.system_listWidget.currentRow() - 2][1]) self.system_listWidget.takeItem(self.system_listWidget.currentRow()) # 重命名分组 # todo : 重命名还没做好 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) load_list = get_todo_list() change_value(load_list[self.system_listWidget.currentRow() - 2][1], 'title', item_name) self.update_signal.emit() # 重命名发送信号 self.initUI() # self.update_signal.emit() self.dialog.close() class MainWindow(QWidget): def __init__(self): super(MainWindow, self).__init__() self.resize(1150, 850) self.setWindowTitle("待办事项") # 主布局,用来显示主页面,设置页面等 self.layout = QStackedLayout(self) self.main_widget = MainWidget() # self.main_widget.resize(50, 200) self.layout.addWidget(self.main_widget) if __name__ == "__main__": app = QApplication(sys.argv) main = MainWindow() main.setWindowTitle('PyQtToDoList') # print(os.path.abspath('../')) style_sheet = QSSLoader.read_qss_file(os.getcwd() + '/../resource/current.qss') main.setStyleSheet(style_sheet) app.setWindowIcon(QIcon(os.path.abspath('../') + '/images/todo.svg')) main.show() sys.exit(app.exec_())