pyqt-todolist/main/main.py

362 lines
15 KiB
Python
Raw Normal View History

2022-04-01 22:25:19 +08:00
import os
import sys
from PyQt5.QtGui import *
2022-03-29 20:28:43 +08:00
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt, pyqtSignal, QRect
2022-04-26 17:07:00 +08:00
from utils.BasicUtils import get_todo_list, remove_todo_list, change_value, read_ini, set_exit_status
2022-04-26 21:10:49 +08:00
from utils.CreateConfigure import CreateConfigure
from utils.CreateToDo import CreateToDo
2022-04-01 22:25:19 +08:00
from utils.QSSLoader import QSSLoader
2022-04-12 21:34:18 +08:00
from view.ImportantView import Important
from view.MyListWidget import MyListWidget
from view.ToDoListView import ToDoList
2022-04-01 22:25:19 +08:00
from view.UserLabel import User
from view.SelfListWidgetItem import SelfListWidgetItem
2022-04-07 19:34:28 +08:00
from view.AddListLabel import AddListAction
2022-04-07 21:11:37 +08:00
from view.MyDayView import MyDay
2022-03-31 21:55:51 +08:00
2022-04-01 22:25:19 +08:00
class MainWidget(QWidget):
update_signal = pyqtSignal()
2022-05-03 18:59:06 +08:00
# 重载UI信号
reload_signal = pyqtSignal()
2022-03-31 21:55:51 +08:00
def __init__(self):
2022-04-01 22:25:19 +08:00
super(MainWidget, self).__init__()
self.user_label = User()
2022-04-26 21:10:49 +08:00
self.create_config = CreateConfigure()
2022-04-01 22:25:19 +08:00
# 主布局,左右两侧
2022-03-31 21:55:51 +08:00
layout = QHBoxLayout()
2022-04-01 22:25:19 +08:00
# 子布局,左边的部分
self.sub_layout = QVBoxLayout()
self.sub_layout.spacing()
2022-04-07 19:34:28 +08:00
self.sub_layout.addWidget(self.user_label, 2)
2022-04-01 22:25:19 +08:00
# 左侧列表
self.system_listWidget = MyListWidget(self)
2022-04-12 21:34:18 +08:00
self.system_listWidget.setFrameShape(QListWidget.NoFrame)
2022-04-07 19:34:28 +08:00
self.sub_layout.addWidget(self.system_listWidget, 15)
2022-04-01 22:25:19 +08:00
2022-04-07 21:11:37 +08:00
# 添加最下边的QLabel
2022-04-07 19:34:28 +08:00
self.add_list_action = AddListAction()
self.add_list_action.create_todo_list.connect(self.create_item)
# self.add_item_label.setPixmap(QPixmap())
2022-04-07 19:34:28 +08:00
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)
2022-04-01 22:25:19 +08:00
# 右侧层叠窗口
2022-04-07 21:11:37 +08:00
2022-04-12 21:34:18 +08:00
self.my_day = MyDay()
self.important = Important()
2022-04-01 22:25:19 +08:00
self.stackedWidget = QStackedWidget(self)
2022-04-12 21:34:18 +08:00
self.stackedWidget.addWidget(self.my_day)
self.stackedWidget.addWidget(self.important)
2022-04-01 22:25:19 +08:00
2022-04-07 21:11:37 +08:00
layout.addLayout(self.sub_layout, 2)
2022-04-01 22:25:19 +08:00
2022-04-07 21:11:37 +08:00
layout.addWidget(self.stackedWidget, 6)
2022-04-01 22:25:19 +08:00
2022-04-12 21:34:18 +08:00
self.system_listWidget.currentRowChanged.connect(self.stackedWidget.setCurrentIndex)
self.load_list = get_todo_list()
2022-04-01 22:25:19 +08:00
self.setLayout(layout)
2022-05-03 18:59:06 +08:00
self.user_label.sync_signal.connect(self.refresh_action)
self.reload_signal.connect(self.refresh_action)
2022-04-01 22:25:19 +08:00
self.initUI()
2022-05-03 18:59:06 +08:00
# self.update_signal.connect(self.initUI)
2022-04-01 22:25:19 +08:00
def initUI(self):
self.important.update_signal.connect(self.my_day.refresh_action)
self.my_day.update_signal.connect(self.important.refresh_action)
# 先清除列表,方便后面调用
self.system_listWidget.clear()
# 系统默认的两个 item
self.one_day = SelfListWidgetItem('我的一天', 0, None, os.getcwd() + '/../images/sun.svg')
self.system_listWidget.setCurrentRow(1)
self.important_item = SelfListWidgetItem('重要', 0, None, os.getcwd() + '/../images/star.svg')
2022-04-01 22:25:19 +08:00
self.system_listWidget.addItem(self.one_day)
self.system_listWidget.setItemWidget(self.one_day, self.one_day.widget)
2022-04-12 21:34:18 +08:00
self.system_listWidget.addItem(self.important_item)
self.system_listWidget.setItemWidget(self.important_item, self.important_item.widget)
2022-04-23 17:36:22 +08:00
# todo 通过信号修改显示的标题名字
# self.system_listWidget.change_list_name.connect(self.change_list)
# 加载列表
# todobug 第一个为空会导致无法添加
if self.load_list:
for load in self.load_list:
self.load_item(load[0], load[1], load[3])
2022-05-03 18:59:06 +08:00
def refresh_action(self):
self.load_list = get_todo_list()
self.initUI()
2022-04-01 22:25:19 +08:00
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)
2022-04-30 10:00:43 +08:00
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()
# print(self.load_list)
self.load_list[self.system_listWidget.currentRow() - 2][3] = icon
# print(self.load_list[self.system_listWidget.currentRow() - 2][3])
change_value(self.load_list[self.system_listWidget.currentRow() - 2][1], 'icon', icon)
self.initUI()
# 加载左侧列表
def load_item(self, list_name, uid, icon=None):
2022-05-03 18:59:06 +08:00
# print('加载列表')
# 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)
2022-04-16 21:45:29 +08:00
self.system_listWidget.addItem(item)
todo_list = ToDoList(list_name, uid)
2022-04-23 17:36:22 +08:00
# 信号测试成功!!
# 更新 重要 内容
2022-04-23 17:36:22 +08:00
todo_list.update_signal.connect(self.important.refresh_action)
todo_list.update_signal.connect(self.my_day.refresh_action)
2022-05-03 18:59:06 +08:00
# todo_list.update_signal.connect(self.initUI)
# 删除分组时可用
2022-04-23 17:36:22 +08:00
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,用户自己起名字.
2022-04-16 21:45:29 +08:00
# self.system_listWidget.editItem(item)
self.stackedWidget.addWidget(todo_list)
2022-04-16 21:45:29 +08:00
self.system_listWidget.setItemWidget(item, item.widget)
2022-04-26 17:07:00 +08:00
# 点击创建新的分组
def create_item(self, new_list='新建列表', uid=None):
if not uid:
create_todo = CreateToDo('ToDoList', new_list)
self.load_list.append(create_todo)
2022-05-03 18:59:06 +08:00
self.load_item(self.load_list[-1][0],self.load_list[-1][1],self.load_list[-1][3])
# 删除分组
def delete_item(self):
# print(self.load_list[self.system_listWidget.currentRow() - 2][1])
index = self.system_listWidget.currentRow() - 2
# print(self.load_list)
# print('index:',index)
# print('delete:', self.load_list[index])
remove_todo_list(self.load_list[index][1])
del self.load_list[index]
# print('result:', self.load_list)
2022-05-24 11:14:06 +08:00
# print('<main>(delete_item)', self.stackedWidget.indexOf(self.stackedWidget.currentWidget()))
self.stackedWidget.removeWidget(self.stackedWidget.currentWidget())
self.system_listWidget.takeItem(self.system_listWidget.currentRow())
# 重命名分组
2022-04-26 17:07:00 +08:00
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)
index = self.system_listWidget.currentRow() - 2
if item_name:
self.load_list[index][0] = item_name
# print(self.load_list)
# print(self.load_list[index][1])
change_value(self.load_list[index][1], 'title', item_name)
self.update_signal.emit()
# 重命名发送信号
self.initUI()
# self.update_signal.emit()
self.dialog.close()
2022-04-01 22:25:19 +08:00
class MainWindow(QWidget):
def __init__(self):
super(MainWindow, self).__init__()
self.resize(1150, 850)
2022-04-01 22:25:19 +08:00
self.setWindowTitle("待办事项")
# 主布局,用来显示主页面,设置页面等
self.layout = QStackedLayout(self)
self.main_widget = MainWidget()
# self.main_widget.resize(50, 200)
self.layout.addWidget(self.main_widget)
2022-04-26 17:07:00 +08:00
self.tray_icon = QSystemTrayIcon(self)
self.tray_icon.setIcon(QIcon(os.getcwd() + '/../images/todo_info.svg'))
# # self.style().standardIcon(QStyle.SP_ComputerIcon))
#
# self.checkbox = QCheckBox('最小化')
# layout.addWidget(self.checkbox)
'''
Define and add steps to work with the system tray icon
show - show window
hide - hide window
exit - exit from application
'''
show_action = QAction("显示", self)
quit_action = QAction("退出", self)
hide_action = QAction("隐藏", self)
show_action.triggered.connect(self.show)
hide_action.triggered.connect(self.hide)
quit_action.triggered.connect(QApplication.instance().quit)
tray_menu = QMenu()
tray_menu.addAction(show_action)
tray_menu.addAction(hide_action)
tray_menu.addAction(quit_action)
self.tray_icon.setContextMenu(tray_menu)
self.tray_icon.show()
# self.exit_widget = QWidget(self)
#
# self.exit_widget.setLayout(layout)
# 关闭窗口时弹出确认消息
def closeEvent(self, event):
# 创建一个消息盒子(提示框)
quitMsgBox = QMessageBox()
# 设置气泡在屏幕上的位置水平居中垂直屏幕80%位置
# desktop = QApplication.desktop()
# quitMsgBox.setGeometry(QRect(int(desktop.width() / 2 - 75), int(desktop.height() * 0.5), 400, 300))
2022-04-26 17:07:00 +08:00
self.save_config = QCheckBox('记住选择')
self.save_config.setChecked(True)
2022-04-26 17:07:00 +08:00
quitMsgBox.setCheckBox(self.save_config)
# self.save_config.stateChanged.connect(self.save_exit)
quitMsgBox.resize(300, 200)
# 设置提示框的标题
quitMsgBox.setWindowTitle('确认窗口')
# 设置提示框的内容
quitMsgBox.setText('你确定退出吗?')
# 创建两个点击的按钮,修改文本显示内容
buttonY = QPushButton('退出程序')
buttonN = QPushButton('最小化到托盘')
# 将两个按钮加到这个消息盒子中去并指定yes和no的功能
style = QSSLoader.read_qss_file(os.getcwd() + '/../resource/closeDialog.qss')
2022-04-26 17:07:00 +08:00
buttonY.setStyleSheet(style)
buttonN.setStyleSheet(style)
quitMsgBox.addButton(buttonY, QMessageBox.YesRole)
quitMsgBox.addButton(buttonN, QMessageBox.NoRole)
exit_status = read_ini('System', 'exitstatus')
if exit_status == 'None':
# self.center(quitMsgBox)
quitMsgBox.exec_()
# 判断返回值如果点击的是Yes按钮我们就关闭组件和应用否则就忽略关闭事件
if quitMsgBox.clickedButton() == buttonY:
if self.save_config.isChecked():
set_exit_status('Exit')
event.accept()
else:
if self.save_config.isChecked():
set_exit_status('Min')
self.hide()
event.ignore()
elif exit_status == 'Exit':
event.accept()
elif exit_status == 'Min':
# print('Min')
self.hide()
event.ignore()
2022-04-01 22:25:19 +08:00
if __name__ == "__main__":
app = QApplication(sys.argv)
main = MainWindow()
main.setWindowTitle('PyQtToDoList')
2022-04-01 22:25:19 +08:00
# print(os.path.abspath('../'))
style_sheet = QSSLoader.read_qss_file(os.getcwd() + '/../resource/current.qss')
2022-04-01 22:25:19 +08:00
main.setStyleSheet(style_sheet)
app.setWindowIcon(QIcon(os.path.abspath('../') + '/images/todo_info.svg'))
2022-04-01 22:25:19 +08:00
main.show()
sys.exit(app.exec_())