Skip to content

Commit 083a4c3

Browse files
committed
重构
1 parent 1ae2b5d commit 083a4c3

36 files changed

+501
-678
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,5 +74,5 @@ fabric.properties
7474
config.json
7575
logs
7676
resource_rc.py
77-
view/ui_login_window.py
77+
ui_view/ui_login_window.py
7878
view/ui_main_window.py

README.md

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,30 +9,28 @@
99
## 简介
1010

1111
本项目基于[PyQt-Fluent-Widgets](https://github.com/zhiyiYo/PyQt-Fluent-Widgets/), 为了方便像我这样的新手使用,将其封装成了一个模板,带有日志记录模块,
12-
密码保存、简单实现了登录界面和主界面的切换,多线程的操作,可以直接使用qt designer进行界面设计,然后专注写业务代码。
12+
密码保存、简单实现了登录界面和主界面的切换,异步操作,可以直接使用qt designer进行界面设计,然后专注写业务代码。
1313

14-
<strong>注意:由于本人仅仅为编程爱好者,并非职业程序员,代码水平不高,此项目仅做参考。</strong>
14+
<strong>注意:由于本人仅仅为编程爱好者,并非职业程序员,代码质量很差,此项目仅做参考。</strong>
1515

1616
## 登录界面
1717

18-
<img src="https://github.com/Cheukfung/pyqt-fluent-widgets-template/blob/pyqt5/example%20image/login.png?raw=true">
18+
<img src="https://github.com/Cheukfung/pyqt-fluent-widgets-template/blob/pyside6/screen_shot/login.png?raw=true">
1919

2020
## 主界面
21-
<img src="https://github.com/Cheukfung/pyqt-fluent-widgets-template/blob/pyqt5/example%20image/main_window.png?raw=true">
22-
<img src="https://github.com/Cheukfung/pyqt-fluent-widgets-template/blob/pyqt5/example%20image/main_dark.png?raw=true">
21+
<img src="https://github.com/Cheukfung/pyqt-fluent-widgets-template/blob/pyside6/screen_shot/main_window.png?raw=true">
22+
<img src="https://github.com/Cheukfung/pyqt-fluent-widgets-template/blob/pyside6/screen_shot/main_dark.png?raw=true">
2323

24-
## 实现
25-
26-
由ui文件生成py文件,然后main_window.py文件中导入界面类,为界面添加标题栏和侧边栏。
2724

2825
## 使用方法
29-
26+
### ui编辑
3027
<img src="https://github.com/Cheukfung/pyqt-fluent-widgets-template/blob/pyqt5/example%20image/qt%20desinger.png?raw=true">
31-
clone项目到本地,使用qt-designer打开view/main_window.ui文件,主界面由stackedwidget组成,默认有3个页面,分别是page1、page2和setting_page,使用时只需要把相应的控件添加到对应的页面即可。
32-
33-
## 添加stackedwidget页面
28+
clone项目到本地,打开ui_page目录,里面共有2个页面,使用qt-designer打开,使用时只需要把相应的控件添加到对应的页面即可。
29+
### 绑定控件事件
30+
参考 view/pages/page_one.py和view/pages/page_one_handler.py, 在page_one_handler.py中添加对应的事件处理函数,然后在page_one.py中绑定对应的控件事件。
3431

35-
如果需要添加stackedwidget页面,先在qtdesigner里面添加页面,然后在navigation_interface.py文件中参照原有代码添加对应的导航按钮即可。
32+
## 添加页面
33+
如果需要添加页面,在ui_page添加页面,然后在view/pages/中参考page_one.py添加对应的页面、参考page_one_handler.py中添加对应的事件处理函数。
3634

3735
## 修改样式文件
3836

api/api.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import time
2+
3+
4+
class DemoApi:
5+
6+
def get_captcha(self):
7+
time.sleep(1)
8+
b64_data = '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'
9+
return {'data': b64_data}
10+
11+
def login(self, username, password, captcha, sms_code):
12+
print('登录测试:', username, password, captcha, sms_code)
13+
time.sleep(1)
14+
return True
15+
16+
def sleep(self, seconds):
17+
time.sleep(seconds)
18+
19+
20+
demo_api = DemoApi()

common/public.py

Lines changed: 0 additions & 86 deletions
This file was deleted.

common/threads.py

Lines changed: 0 additions & 62 deletions
This file was deleted.

common/utils.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
from enum import Enum
2+
3+
from PySide6.QtGui import QDesktopServices
4+
from PySide6.QtWidgets import QLabel
5+
from qfluentwidgets import Theme, Dialog, StyleSheetBase, qconfig
6+
7+
8+
class StyleSheet(StyleSheetBase, Enum):
9+
""" Style sheet """
10+
11+
WINDOW = "main_window"
12+
LOGIN = "login_window"
13+
SETTINGS = "setting_interface"
14+
15+
def path(self, theme=Theme.AUTO):
16+
theme = qconfig.theme if theme == Theme.AUTO else theme
17+
return f":/resource/qss/{theme.value.lower()}/{self.value}.qss"
18+
19+
20+
def show_dialog(parent, content, title='提示', url=None, callback=None):
21+
w = Dialog(title, content, parent)
22+
w.contentLabel.setOpenExternalLinks(True)
23+
if url:
24+
w.contentLabel.mousePressEvent = lambda e: QDesktopServices.openUrl(url)
25+
max_height = 400
26+
if parent:
27+
max_height = parent.screen().availableGeometry().height() * 0.5
28+
w.contentLabel.setMaximumHeight(max_height * 0.5)
29+
# w.contentLabel.setMinimumWidth(240)
30+
w.windowTitleLabel.hide()
31+
if not callback:
32+
w.yesButton.hide()
33+
w.cancelButton.setText('确定')
34+
w.buttonLayout.insertWidget(0, QLabel(''))
35+
w.buttonLayout.setStretch(0, 1)
36+
w.buttonLayout.setStretch(1, 1)
37+
if w.exec():
38+
if callback:
39+
callback()
40+
else:
41+
pass
42+
43+
44+
def set_window_center(window):
45+
""" set window center """
46+
qr = window.frameGeometry()
47+
cp = window.screen().availableGeometry().center()
48+
qr.moveCenter(cp)
49+
window.move(qr.topLeft())

components/avatar_widget.py

Lines changed: 0 additions & 56 deletions
This file was deleted.

components/bar.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
from PySide6.QtCore import Qt, QPoint
2+
from qfluentwidgets import InfoBar, FluentIcon, IndeterminateProgressRing, InfoBarIcon, FluentStyleSheet, InfoBarManager
3+
4+
5+
@InfoBarManager.register('Custom')
6+
class CustomInfoBarManager(InfoBarManager):
7+
def _pos(self, infoBar: InfoBar, parentSize=None):
8+
p = infoBar.parent()
9+
parentSize = parentSize or p.size()
10+
x = (parentSize.width() - infoBar.width()) // 2
11+
y = 40
12+
return QPoint(x, y)
13+
14+
def _slideStartPos(self, infoBar: InfoBar):
15+
pos = self._pos(infoBar)
16+
return QPoint(pos.x(), pos.y() - 16)
17+
18+
19+
class ProgressInfoBar(InfoBar):
20+
def __init__(self, title, content, parent):
21+
super().__init__(icon=FluentIcon.SYNC,
22+
title=title,
23+
content=content,
24+
orient=Qt.Horizontal,
25+
isClosable=True,
26+
position='Custom',
27+
duration=-1, parent=parent)
28+
29+
self.spinner = IndeterminateProgressRing()
30+
self.spinner.setFixedSize(22, 22)
31+
self.spinner.setStrokeWidth(3)
32+
self.hBoxLayout.setContentsMargins(12, 8, 8, 8)
33+
self.hBoxLayout.setSpacing(8)
34+
self.textLayout.setSpacing(0)
35+
self.iconWidget.deleteLater()
36+
self.hBoxLayout.insertWidget(0, self.spinner)
37+
self.setProperty('type', InfoBarIcon.SUCCESS.value)
38+
FluentStyleSheet.INFO_BAR.apply(self)

0 commit comments

Comments
 (0)