Skip to content
This repository was archived by the owner on Jun 28, 2025. It is now read-only.

Commit ad0c01a

Browse files
committed
fix(FormMain_ui): fix #9
refactor(ModPage, FormMain_ui): 把自编的页面切换逻辑改成原生的 QStackedWidget
1 parent 94ed04c commit ad0c01a

4 files changed

Lines changed: 45 additions & 62 deletions

File tree

Plain_Craft_Launcher_2/FormMain.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,7 @@ def resizeEvent(self, a0: QResizeEvent):
9393
self.ui.PanTitle.setGeometry(0, 0, self.container.width(), title_height)
9494
self.ui.PanMain.setGeometry(0, title_height, self.container.width(), self.container.height() - title_height)
9595

96-
# 更新PageLaunch大小并确保它在最上层
97-
self.ui.page.setGeometry(0, 0, self.ui.PanMain.width(), self.ui.PanMain.height())
98-
self.ui.page.raise_()
96+
# 不需要单独更新页面大小,QStackedWidget 会自动调整子组件大小
9997

10098
def close_window(self):
10199
"""处理窗口关闭(对应的信号:BtnExit.clicked)"""

Plain_Craft_Launcher_2/FormMain_ui.py

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -52,18 +52,16 @@ def setupUi(self, FormMain: QtWidgets.QWidget):
5252
self.PanTitle.setObjectName("PanTitle")
5353

5454
# 主 Panel
55-
self.PanMain = QtWidgets.QFrame(FormMain)
55+
self.PanMain = QtWidgets.QStackedWidget(FormMain)
5656
self.PanMain.setGeometry(QtCore.QRect(0, title_height, size[0], (size[1] - title_height)))
5757
self.PanMain.setStyleSheet(f"""
58-
QFrame#PanMain {{
58+
QStackedWidget#PanMain {{
5959
background-color: qlineargradient(spread:pad, x1:0.9, y1:0.1, x2:0, y2:1,
6060
stop:0 {setup.get_settings('ColorBrush5')}, stop:1 {setup.get_settings('ColorBrush6')});
6161
border-bottom-left-radius: {corner_radius}px;
6262
border-bottom-right-radius: {corner_radius}px;
6363
}}
6464
""")
65-
self.PanMain.setFrameShape(QtWidgets.QFrame.NoFrame)
66-
self.PanMain.setFrameShadow(QtWidgets.QFrame.Plain)
6765
self.PanMain.setObjectName("PanMain")
6866

6967
# 标题栏按钮 -- 退出
@@ -77,9 +75,9 @@ def setupUi(self, FormMain: QtWidgets.QWidget):
7775
self.BtnMin.setObjectName("BtnMin")
7876

7977
# 标题栏按钮 -- 切换到下载页面
78+
# 标题栏按钮 -- 切换到启动页面
8079
self.BtnPageLaunch = MyIconTextButton(self.PanTitle, svg_path="Images/BtnTitlePageLaunch.svg",
81-
text="Launch",
82-
command=lambda: self.page_manager.switch_page(self.PanMain, 0))
80+
text="Launch", command=lambda: self.page_manager.switch_page(self.PanMain, 0))
8381
self.BtnPageLaunch.setGeometry(QtCore.QRect(500, 8, 0, 0))
8482
self.BtnPageLaunch.setObjectName("BtnPageDownload")
8583

@@ -90,10 +88,18 @@ def setupUi(self, FormMain: QtWidgets.QWidget):
9088
self.SVGTitle.setStyleSheet("background-color: transparent;")
9189
self.SVGTitle.setObjectName("SVGTitle")
9290

93-
self.page = PageLaunch(self.PanMain)
94-
self.page.setGeometry(QtCore.QRect(0, 0, size[0], (size[1] - title_height)))
95-
self.page.setObjectName("PageLaunch")
96-
self.page.raise_()
91+
# 添加页面到 QStackedWidget
92+
self.page_launch = PageLaunch()
93+
self.PanMain.addWidget(self.page_launch)
94+
95+
# 如果有 PageDownload,也添加进来
96+
from Pages.PageDownload.PageDownload import PageDownload
97+
self.page_download = PageDownload()
98+
self.PanMain.addWidget(self.page_download)
99+
100+
# 默认显示第一个页面
101+
self.PanMain.setCurrentIndex(0)
102+
97103

98104
self.retranslateUi(FormMain)
99105
QtCore.QMetaObject.connectSlotsByName(FormMain)
Lines changed: 21 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
11
# -*- coding: utf-8 -*-
2-
from PyQt5.QtWidgets import QWidget, QFrame
3-
import importlib
4-
import sys
2+
from PyQt5.QtWidgets import QStackedWidget
53

64
from Modules.Base.ModLogging import ModLogging, LoggingType as LT
7-
from Modules.Base.ModSetup import ModSetup as Setup
8-
95
from Pages.PageLaunch.PageLaunch import PageLaunch
106
from Pages.PageDownload.PageDownload import PageDownload
117

@@ -29,62 +25,38 @@ def __init__(self):
2925
return
3026

3127
self.logger = ModLogging(module_name="ModPage")
32-
self.current_page = None
28+
self.current_page_index = 0
3329
self._initialized = True
3430

35-
def switch_page(self, pan_main: QFrame, page_id: int) -> bool:
31+
def switch_page(self, stack_widget: QStackedWidget, page_id: int) -> bool:
3632
"""切换页面
3733
3834
Args:
39-
pan_main: 主面板,用于放置页面
40-
page_id: 页面id,如"0"
35+
stack_widget: QStackedWidget 实例
36+
page_id: 页面索引,如 0 表示 PageLaunch
4137
4238
Returns:
4339
bool: 切换是否成功
4440
"""
45-
46-
try:
47-
page_class = PAGES[page_id]
48-
except IndexError:
49-
self.logger.write(f"页面id {page_id} 不存在。", LT.ERROR)
41+
# 检查页面索引是否有效
42+
if page_id < 0 or page_id >= stack_widget.count():
43+
self.logger.write(f"页面索引 {page_id} 超出范围 (0-{stack_widget.count()-1})。", LT.ERROR)
5044
return False
51-
52-
for widget in pan_main.findChildren(QWidget):
53-
obj_name = widget.objectName()
54-
if "Page" in obj_name:
55-
self.current_page = widget
56-
57-
# 如果页面相同,不做任何事情
58-
if self.current_page == page_class:
59-
self.logger.write(f"页面 {page_class.__name__} 已经是当前页面,无需切换", LT.INFO)
45+
46+
# 如果当前已经是该页面,则不做任何操作
47+
if stack_widget.currentIndex() == page_id:
48+
self.logger.write(f"页面 {page_id} 已经是当前页面,无需切换", LT.INFO)
6049
return True
61-
62-
# 记录新页面名称
63-
self.logger.write(f"正在切换到页面: {page_class.__name__}", LT.INFO)
64-
65-
# 删除 PanMain 中的所有子组件
66-
for child in pan_main.findChildren(QWidget):
67-
child.setParent(None)
68-
child.deleteLater()
69-
70-
# 根据传入的页面名称,实例化对应的页面
50+
51+
# 记录新页面索引
52+
self.logger.write(f"正在切换到页面索引: {page_id}", LT.INFO)
53+
54+
# 使用 QStackedWidget 的原生方法切换页面
7155
try:
72-
73-
# 实例化页面
74-
page_instance = page_class(pan_main)
75-
76-
# 设置页面大小
77-
page_instance.setGeometry(0, 0, pan_main.width(), pan_main.height())
78-
79-
# 确保页面在最上层
80-
page_instance.raise_()
81-
82-
# 更新当前页面名称
83-
self.current_page = page_class
84-
85-
self.logger.write(f"成功切换到页面: {page_class.__name__}", LT.INFO)
56+
stack_widget.setCurrentIndex(page_id)
57+
self.current_page_index = page_id
58+
self.logger.write(f"成功切换到页面索引: {page_id}", LT.INFO)
8659
return True
87-
8860
except Exception as e:
89-
self.logger.write(f"切换到页面 {page_class.__name__} 时发生错误: {e}", LT.ERROR)
61+
self.logger.write(f"切换到页面索引 {page_id} 时发生错误: {e}", LT.ERROR)
9062
return False

Plain_Craft_Launcher_2/Pages/PageLaunch/PageLaunch.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,10 @@ def __init__(self, parent=None):
3535
# 初始化左侧 Panel
3636
self.PanLeft = PageLaunchLeft(self)
3737
self.PanLeft.setGeometry(QtCore.QRect(0, 0, 300, (setup.get_settings("size")[1] - setup.get_settings("title_height"))))
38+
39+
40+
def resizeEvent(self, event):
41+
"""处理页面大小变化"""
42+
super().resizeEvent(event)
43+
# 更新左侧面板高度
44+
self.PanLeft.setFixedHeight(self.height())

0 commit comments

Comments
 (0)