bubbleUI 0.4.4a1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
bubble/uiWindow.py ADDED
@@ -0,0 +1,262 @@
1
+ from .QUI import *
2
+ from .widgets import VScrollArea
3
+ from uiml import set_style
4
+
5
+ __all__ = ['SelectUI', 'PagesUI']
6
+
7
+ class SelectUI(QMainWindow):
8
+ def __init__(self):
9
+ super().__init__()
10
+ self.items = [] # 用于存储页面选择按钮文字
11
+ self.buttons = [] # 用于存储所有按钮对象
12
+
13
+ def init_ui(self, name: str=None):
14
+ # 创建中央部件和主布局
15
+ central_widget = QWidget()
16
+ self.setCentralWidget(central_widget)
17
+
18
+ main_layout = QHBoxLayout(central_widget)
19
+ main_layout.setContentsMargins(0, 0, 0, 0) # 去除边距使侧边栏贴边
20
+ main_layout.setSpacing(0)
21
+
22
+ # 侧边栏
23
+ sidebar_layout = QVBoxLayout()
24
+ sidebar_layout.setContentsMargins(0, 0, 0, 0) # 去除边距使侧边栏贴边
25
+
26
+ if name is None:
27
+ self.sidebar_title = None
28
+ else:
29
+ self.sidebar_title = QLabel(name)
30
+ set_style(self.sidebar_title, 'sidebar_title')
31
+
32
+ self.sidebar = QListWidget()
33
+ self.sidebar.setFixedWidth(160) # 固定宽度
34
+
35
+ # 添加项目(名称与对应的图标可自行设置)
36
+ for name in self.items:
37
+ item = QListWidgetItem(name)
38
+ item.setFont(QFont('Microsoft YaHei', 9))
39
+ self.sidebar.addItem(item)
40
+
41
+ # 设置默认选中第一项
42
+ self.sidebar.setCurrentRow(0)
43
+
44
+ # 页面堆叠
45
+ self.stacked_widget = QStackedWidget()
46
+ self.scroll_area = VScrollArea()
47
+ # 让右侧内容跟随窗口:宽度撑满侧边栏右侧的剩余空间,高度撑满窗口
48
+ self.scroll_area.setWidgetResizable(True)
49
+ self.scroll_area.setFrameShape(QFrame.NoFrame)
50
+
51
+ # 创建页面
52
+ for page_id in self.items:
53
+ page = self.create_page(page_id)
54
+ self.stacked_widget.addWidget(page)
55
+
56
+ self.scroll_area.setWidget(self.stacked_widget)
57
+
58
+ # 信号连接
59
+ # 当侧边栏当前行改变时,切换堆叠页面
60
+ self.sidebar.currentRowChanged.connect(self.switch_page)
61
+
62
+ # 布局组合
63
+ if self.sidebar_title is not None:
64
+ sidebar_layout.addWidget(self.sidebar_title)
65
+ sidebar_layout.addWidget(self.sidebar)
66
+
67
+ main_layout.addLayout(sidebar_layout)
68
+ main_layout.addWidget(self.scroll_area, 1)
69
+
70
+ def init_base_ui(self):
71
+ '''创建基础UI'''
72
+ # 创建中心部件和主布局
73
+ self.central_widget = QWidget()
74
+ self.setCentralWidget(self.central_widget)
75
+ self.main_layout = QHBoxLayout(self.central_widget)
76
+
77
+ self.main_layout.setContentsMargins(0, 0, 0, 0) # 去除边距
78
+ self.main_layout.setSpacing(0) # 去除间距
79
+
80
+ # 设置两个滚动区域之间的间距为15像素
81
+ self.main_layout.setSpacing(16)
82
+
83
+ # 创建左侧滚动区域
84
+ self.left_scroll = VScrollArea()
85
+ self.main_layout.addWidget(self.left_scroll, 1) # 拉伸系数为1
86
+
87
+ # 创建右侧滚动区域
88
+ self.right_scroll = VScrollArea()
89
+ # 经典 UI 的内容区也随窗口大小自适应:让页面宽度跟随滚动区域视口伸缩
90
+ self.right_scroll.setWidgetResizable(True)
91
+ self.main_layout.addWidget(self.right_scroll, 5) # 拉伸系数为5
92
+
93
+ def init_ui_old(self):
94
+ '''创建设置界面'''
95
+ self.draw_page_choice()
96
+ self.init_right_pages()
97
+
98
+ def draw_page_choice(self):
99
+ '''绘制左侧页面选择'''
100
+ content = QWidget()
101
+ content_layout = QVBoxLayout(content)
102
+
103
+ # 为每个页面创建按钮
104
+ for i, page_title in enumerate(self.items):
105
+ button = QPushButton(page_title)
106
+ # 连接按钮点击信号到槽函数
107
+ button.clicked.connect(lambda checked, idx=i: (self.switch_page(idx)))
108
+ content_layout.addWidget(button)
109
+ self.buttons.append(button)
110
+
111
+ # 添加一个弹簧,让按钮靠上显示
112
+ content_layout.addStretch()
113
+
114
+ self.left_scroll.setWidget(content)
115
+
116
+ def switch_page(self, idx):
117
+ '''页面按钮点击槽函数'''
118
+ self.stacked_widget.setCurrentIndex(idx)
119
+
120
+ def init_right_pages(self):
121
+ '''初始化右侧设置页面'''
122
+ # 创建堆叠窗口部件
123
+ self.stacked_widget = QStackedWidget()
124
+
125
+ # 为每个左侧选项创建一个对应的右侧页面
126
+ for i, page_title in enumerate(self.items):
127
+ page = self.create_page(page_title)
128
+ self.stacked_widget.addWidget(page)
129
+
130
+ # 将堆叠窗口部件设置为右侧滚动区域的内容
131
+ self.right_scroll.setWidget(self.stacked_widget)
132
+
133
+ def create_page(self, title):
134
+ '''创建设置页面'''
135
+ # 添加:
136
+ # page = QWidget()
137
+ # layout = QVBoxLayout(page)
138
+ # 请在下方添加窗口显示
139
+ # 例如:
140
+ # match title:
141
+ # case '页面1':
142
+ # set_content_label('页面1的内容')
143
+ # case '页面2':
144
+ # set_content_label('页面2的内容')
145
+ #...
146
+ # 然后输入:
147
+ # layout.addStretch()
148
+ # return page
149
+ pass
150
+
151
+ class PagesUI(QMainWindow):
152
+ '''分页窗口类'''
153
+ def __init__(self, pages: list[str]):
154
+ super().__init__()
155
+
156
+ # 页面索引
157
+ self.total_pages = 0
158
+ self.current_page = 0
159
+
160
+ self.set_pages(pages)
161
+ self.init_ui()
162
+ self.update_buttons()
163
+ self.init_pages()
164
+
165
+ def set_pages(self, pages: list[str]):
166
+ '''设置页面'''
167
+ for index, page in enumerate(pages):
168
+ self.__setattr__(f'PAGE_{page}', index)
169
+ self.total_pages += 1
170
+
171
+ def init_ui(self):
172
+ '''初始化UI'''
173
+ # 创建中央部件
174
+ central_widget = QWidget()
175
+ self.setCentralWidget(central_widget)
176
+
177
+ # 创建主布局
178
+ main_layout = QVBoxLayout(central_widget)
179
+ main_layout.setContentsMargins(0, 0, 0, 0) # 移除边距
180
+ main_layout.setSpacing(0) # 移除间距
181
+
182
+ # 页面堆叠控件
183
+ self.stacked_widget = QStackedWidget()
184
+ main_layout.addWidget(self.stacked_widget)
185
+
186
+ # 按钮布局
187
+ self.button_layout = QHBoxLayout()
188
+ self.button_layout.addStretch(0)
189
+
190
+ # 上一步按钮
191
+ self.prev_btn = QPushButton('上一步')
192
+ self.prev_btn.clicked.connect(self.on_prev)
193
+ self.button_layout.addWidget(self.prev_btn)
194
+
195
+ # 下一步按钮
196
+ self.next_btn = QPushButton('下一步')
197
+ self.next_btn.clicked.connect(self.on_next)
198
+ self.button_layout.addWidget(self.next_btn)
199
+
200
+ # 取消/完成按钮容器(重叠放置)
201
+ self.action_button_container = QWidget()
202
+ self.action_button_layout = QHBoxLayout(self.action_button_container)
203
+
204
+ # 取消按钮
205
+ self.cancel_btn = QPushButton('取消')
206
+ self.cancel_btn.clicked.connect(self.close)
207
+ self.action_button_layout.addWidget(self.cancel_btn)
208
+
209
+ # 完成按钮
210
+ self.finish_btn = QPushButton('完成')
211
+ self.finish_btn.clicked.connect(self.close)
212
+ self.action_button_layout.addWidget(self.finish_btn)
213
+
214
+ self.button_layout.addWidget(self.action_button_container)
215
+
216
+ main_layout.addLayout(self.button_layout)
217
+
218
+ def update_buttons(self):
219
+ '''更新按钮的显示/隐藏状态'''
220
+ if (self.current_page == self.total_pages - 1):
221
+ # 最后一页正常页面:只显示完成按钮
222
+ self.prev_btn.setVisible(False)
223
+ self.next_btn.setVisible(False)
224
+ self.cancel_btn.setVisible(False)
225
+ self.finish_btn.setVisible(True)
226
+ else:
227
+ # 正常页面:显示上一步、下一步、取消
228
+ self.prev_btn.setVisible(self.current_page != 0)
229
+ self.next_btn.setVisible(True)
230
+ self.cancel_btn.setVisible(True)
231
+ self.finish_btn.setVisible(False)
232
+
233
+ def draw_page(self):
234
+ '''绘制页面内容'''
235
+ self.stacked_widget.setCurrentIndex(self.current_page)
236
+
237
+ def init_pages(self):
238
+ '''初始化页面'''
239
+ for i in range(self.total_pages):
240
+ self.stacked_widget.addWidget(self.show_page(i))
241
+
242
+ def show_page(self, page_index: int):
243
+ '''显示指定页面'''
244
+ page_widget = QWidget()
245
+ page_layout = QVBoxLayout(page_widget)
246
+
247
+ page_layout.addStretch(1)
248
+ return page_widget
249
+
250
+ def on_prev(self):
251
+ '''切换到上一页'''
252
+ self.set_page(self.current_page - 1)
253
+
254
+ def on_next(self):
255
+ '''切换到下一页'''
256
+ self.set_page(self.current_page + 1)
257
+
258
+ def set_page(self, index):
259
+ '''切换到取消页面'''
260
+ self.current_page = index
261
+ self.draw_page()
262
+ self.update_buttons()