feat(ViperQtProject): 右上角新增深色/浅色主题切换
This commit is contained in:
1 parent
7c85fa8ac0
commit
07a3ad10fe
1 file changed
+191
-8
@@ -50,6 +50,19 @@ install_btn_ptr: t.CPtr = None
|
||||
opt0_ptr: t.CPtr = None
|
||||
opt1_ptr: t.CPtr = None
|
||||
opt2_ptr: t.CPtr = None
|
||||
theme_sel_ptr: t.CPtr = None
|
||||
central_ptr: t.CPtr = None
|
||||
big_ptr: t.CPtr = None
|
||||
sub_ptr: t.CPtr = None
|
||||
desc_ptr: t.CPtr = None
|
||||
lh_ptr: t.CPtr = None
|
||||
h2_ptr: t.CPtr = None
|
||||
h2b_ptr: t.CPtr = None
|
||||
h3_ptr: t.CPtr = None
|
||||
s3_ptr: t.CPtr = None
|
||||
h4_ptr: t.CPtr = None
|
||||
ok_ptr: t.CPtr = None
|
||||
fsum_ptr: t.CPtr = None
|
||||
|
||||
# 全局状态
|
||||
cur_step: int = 0
|
||||
@@ -59,6 +72,7 @@ install_path: str = "C:/Program Files/Viper6"
|
||||
channel_name: str = "稳定版(Stable)"
|
||||
eula_idx: int = 0
|
||||
eula_agreed: int = 0
|
||||
cur_theme: int = 0
|
||||
|
||||
|
||||
# ============================================================
|
||||
@@ -66,10 +80,97 @@ eula_agreed: int = 0
|
||||
# ============================================================
|
||||
dark_qss: str = "QWidget { background-color: #1e1e1e; color: #d4d4d4; font-family: \"Segoe UI\", \"Microsoft YaHei UI\", \"Microsoft YaHei\", \"PingFang SC\", \"Noto Sans CJK SC\", sans-serif; font-size: 13px; } QPushButton { background-color: #333333; border: 1px solid #555555; border-radius: 4px; padding: 7px 16px; color: #ffffff; } QPushButton:hover { background-color: #454545; border-color: #6a6a6a; } QPushButton:pressed { background-color: #2a6da8; border-color: #4a86c8; } QPushButton:disabled { background-color: #2a2a2a; color: #666666; border-color: #3a3a3a; } QLineEdit, QTextEdit { background-color: #252526; border: 1px solid #555555; border-radius: 4px; padding: 5px 8px; color: #ffffff; } QPlainTextEdit { background-color: #1a1a1a; border: 1px solid #555555; border-radius: 4px; color: #cccccc; } QCheckBox { color: #d4d4d4; spacing: 10px; font-size: 14px; } QProgressBar { background-color: #252526; border: 1px solid #555555; border-radius: 4px; text-align: center; color: #ffffff; font-size: 13px; } QProgressBar::chunk { background-color: #4a86c8; border-radius: 3px; } QTreeWidget { background-color: #1a1a1a; border: 1px solid #555555; border-radius: 4px; color: #d4d4d4; } QTreeWidget::item { height: 26px; padding-left: 4px; } QTreeWidget::item:selected { background-color: #2a6da8; color: #ffffff; } QComboBox { background-color: #252526; border: 1px solid #555555; border-radius: 4px; padding: 5px 10px; color: #ffffff; } QComboBox:hover { border-color: #6a6a6a; } QComboBox::drop-down { border: none; width: 22px; } QComboBox QAbstractItemView { background-color: #252526; color: #ffffff; border: 1px solid #555555; selection-background-color: #2a6da8; } QScrollBar:vertical { background: #252526; width: 10px; margin: 0px; border: none; border-radius: 5px; } QScrollBar::handle:vertical { background: #4a4a4a; min-height: 24px; border-radius: 5px; } QScrollBar::handle:vertical:hover { background: #5a5a5a; } QScrollBar::add-line:vertical, QScrollBar::sub-line:vertical { height: 0px; } QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { background: transparent; } QScrollBar:horizontal { background: #252526; height: 10px; margin: 0px; border: none; border-radius: 5px; } QScrollBar::handle:horizontal { background: #4a4a4a; min-width: 24px; border-radius: 5px; } QScrollBar::handle:horizontal:hover { background: #5a5a5a; } QScrollBar::add-line:horizontal, QScrollBar::sub-line:horizontal { width: 0px; } QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal { background: transparent; }"
|
||||
|
||||
light_qss: str = "QWidget { background-color: #f5f6f8; color: #1e1e1e; font-family: \"Segoe UI\", \"Microsoft YaHei UI\", \"Microsoft YaHei\", \"PingFang SC\", \"Noto Sans CJK SC\", sans-serif; font-size: 13px; } QPushButton { background-color: #ffffff; border: 1px solid #b9c0cb; border-radius: 4px; padding: 7px 16px; color: #1e1e1e; } QPushButton:hover { background-color: #eef1f6; border-color: #8a97a8; } QPushButton:pressed { background-color: #2a6da8; border-color: #2a6da8; color: #ffffff; } QPushButton:disabled { background-color: #eceef1; color: #9aa3b0; border-color: #d3d8e0; } QLineEdit, QTextEdit { background-color: #ffffff; border: 1px solid #b9c0cb; border-radius: 4px; padding: 5px 8px; color: #1e1e1e; } QPlainTextEdit { background-color: #ffffff; border: 1px solid #c6ccd6; border-radius: 4px; color: #1e1e1e; } QCheckBox { color: #1e1e1e; spacing: 10px; font-size: 14px; } QProgressBar { background-color: #e2e6ec; border: 1px solid #c6ccd6; border-radius: 4px; text-align: center; color: #1e1e1e; font-size: 13px; } QProgressBar::chunk { background-color: #2a6da8; border-radius: 3px; } QTreeWidget { background-color: #ffffff; border: 1px solid #c6ccd6; border-radius: 4px; color: #1e1e1e; } QTreeWidget::item { height: 26px; padding-left: 4px; } QTreeWidget::item:selected { background-color: #d6e4f5; color: #1e1e1e; } QComboBox { background-color: #ffffff; border: 1px solid #b9c0cb; border-radius: 4px; padding: 5px 10px; color: #1e1e1e; } QComboBox:hover { border-color: #8a97a8; } QComboBox::drop-down { border: none; width: 22px; } QComboBox QAbstractItemView { background-color: #ffffff; color: #1e1e1e; border: 1px solid #b9c0cb; selection-background-color: #d6e4f5; } QScrollBar:vertical { background: #e2e6ec; width: 10px; margin: 0px; border: none; border-radius: 5px; } QScrollBar::handle:vertical { background: #b0b9c6; min-height: 24px; border-radius: 5px; } QScrollBar::handle:vertical:hover { background: #9aa3b0; } QScrollBar::add-line:vertical, QScrollBar::sub-line:vertical { height: 0px; } QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { background: transparent; } QScrollBar:horizontal { background: #e2e6ec; height: 10px; margin: 0px; border: none; border-radius: 5px; } QScrollBar::handle:horizontal { background: #b0b9c6; min-width: 24px; border-radius: 5px; } QScrollBar::handle:horizontal:hover { background: #9aa3b0; } QScrollBar::add-line:horizontal, QScrollBar::sub-line:horizontal { width: 0px; } QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal { background: transparent; }"
|
||||
|
||||
|
||||
# 导航项样式
|
||||
nav_active_qss: str = "font-size: 15px; color: #ffffff; font-weight: bold; background-color: #2a6da8; padding: 10px 14px; border-radius: 4px;"
|
||||
nav_idle_qss: str = "font-size: 15px; color: #8a8a8a; padding: 10px 14px;"
|
||||
nav_active_qss_light: str = "font-size: 15px; color: #ffffff; font-weight: bold; background-color: #2a6da8; padding: 10px 14px; border-radius: 4px;"
|
||||
nav_idle_qss_light: str = "font-size: 15px; color: #5a6470; padding: 10px 14px;"
|
||||
|
||||
# ============================================================
|
||||
# 文字样式角色(深/浅主题变体)
|
||||
# ============================================================
|
||||
t_d_huge: str = "font-size: 34px; color: #ffffff; font-weight: bold;"
|
||||
t_l_huge: str = "font-size: 34px; color: #1e1e1e; font-weight: bold;"
|
||||
t_d_title: str = "font-size: 22px; color: #ffffff; font-weight: bold;"
|
||||
t_l_title: str = "font-size: 22px; color: #1e1e1e; font-weight: bold;"
|
||||
t_d_sub: str = "font-size: 16px; color: #9cdcfe;"
|
||||
t_l_sub: str = "font-size: 16px; color: #2a6da8;"
|
||||
t_d_dim: str = "font-size: 13px; color: #9a9a9a;"
|
||||
t_l_dim: str = "font-size: 13px; color: #5a6470;"
|
||||
t_d_accent: str = "font-size: 13px; color: #9cdcfe;"
|
||||
t_l_accent: str = "font-size: 13px; color: #2a6da8;"
|
||||
t_d_ok: str = "font-size: 30px; color: #4ec9b0; font-weight: bold;"
|
||||
t_l_ok: str = "font-size: 30px; color: #178a63; font-weight: bold;"
|
||||
t_d_body: str = "font-size: 14px; color: #d4d4d4;"
|
||||
t_l_body: str = "font-size: 14px; color: #1e1e1e;"
|
||||
t_d_pathbox: str = "background-color: #252526; border: 1px solid #555555; border-radius: 4px; padding: 5px 8px; color: #ffffff;"
|
||||
t_l_pathbox: str = "background-color: #ffffff; border: 1px solid #b9c0cb; border-radius: 4px; padding: 5px 8px; color: #1e1e1e;"
|
||||
|
||||
|
||||
# ============================================================
|
||||
# 主题辅助:返回当前主题下的样式字符串
|
||||
# ============================================================
|
||||
def NavActiveCss() -> str:
|
||||
if cur_theme == 1:
|
||||
return nav_active_qss_light
|
||||
return nav_active_qss
|
||||
|
||||
|
||||
def NavIdleCss() -> str:
|
||||
if cur_theme == 1:
|
||||
return nav_idle_qss_light
|
||||
return nav_idle_qss
|
||||
|
||||
|
||||
def CssHuge() -> str:
|
||||
if cur_theme == 1:
|
||||
return t_l_huge
|
||||
return t_d_huge
|
||||
|
||||
|
||||
def CssTitle() -> str:
|
||||
if cur_theme == 1:
|
||||
return t_l_title
|
||||
return t_d_title
|
||||
|
||||
|
||||
def CssSub() -> str:
|
||||
if cur_theme == 1:
|
||||
return t_l_sub
|
||||
return t_d_sub
|
||||
|
||||
|
||||
def CssDim() -> str:
|
||||
if cur_theme == 1:
|
||||
return t_l_dim
|
||||
return t_d_dim
|
||||
|
||||
|
||||
def CssAccent() -> str:
|
||||
if cur_theme == 1:
|
||||
return t_l_accent
|
||||
return t_d_accent
|
||||
|
||||
|
||||
def CssOk() -> str:
|
||||
if cur_theme == 1:
|
||||
return t_l_ok
|
||||
return t_d_ok
|
||||
|
||||
|
||||
def CssBody() -> str:
|
||||
if cur_theme == 1:
|
||||
return t_l_body
|
||||
return t_d_body
|
||||
|
||||
|
||||
def CssPathBox() -> str:
|
||||
if cur_theme == 1:
|
||||
return t_l_pathbox
|
||||
return t_d_pathbox
|
||||
|
||||
|
||||
# ============================================================
|
||||
@@ -108,13 +209,13 @@ def GotoStep(step: int):
|
||||
global cur_step
|
||||
cur_step = step
|
||||
vqt6.vqt6_qstackedwidget_set_current_index(stack_ptr, step)
|
||||
# 导航高亮
|
||||
SetNavStyle(nav0_ptr, nav_active_qss if step == 0 else nav_idle_qss)
|
||||
SetNavStyle(nav1_ptr, nav_active_qss if step == 1 else nav_idle_qss)
|
||||
SetNavStyle(nav2_ptr, nav_active_qss if step == 2 else nav_idle_qss)
|
||||
SetNavStyle(nav3_ptr, nav_active_qss if step == 3 else nav_idle_qss)
|
||||
SetNavStyle(nav4_ptr, nav_active_qss if step == 4 else nav_idle_qss)
|
||||
SetNavStyle(nav5_ptr, nav_active_qss if step == 5 else nav_idle_qss)
|
||||
# 导航高亮(按当前主题)
|
||||
SetNavStyle(nav0_ptr, NavActiveCss() if step == 0 else NavIdleCss())
|
||||
SetNavStyle(nav1_ptr, NavActiveCss() if step == 1 else NavIdleCss())
|
||||
SetNavStyle(nav2_ptr, NavActiveCss() if step == 2 else NavIdleCss())
|
||||
SetNavStyle(nav3_ptr, NavActiveCss() if step == 3 else NavIdleCss())
|
||||
SetNavStyle(nav4_ptr, NavActiveCss() if step == 4 else NavIdleCss())
|
||||
SetNavStyle(nav5_ptr, NavActiveCss() if step == 5 else NavIdleCss())
|
||||
|
||||
|
||||
# ============================================================
|
||||
@@ -297,6 +398,63 @@ def OnFinish(slot_id: int, data: t.CPtr):
|
||||
vqt6.vqt6_qapplication_quit(app_ptr)
|
||||
|
||||
|
||||
# ============================================================
|
||||
# 主题切换(右上角)
|
||||
# ============================================================
|
||||
def RestyleAll():
|
||||
"""按当前主题重刷带内联样式的关键控件"""
|
||||
vqt6.vqt6_qwidget_set_stylesheet_utf8(big_ptr, CssHuge())
|
||||
vqt6.vqt6_qwidget_set_stylesheet_utf8(sub_ptr, CssSub())
|
||||
vqt6.vqt6_qwidget_set_stylesheet_utf8(desc_ptr, CssDim())
|
||||
vqt6.vqt6_qwidget_set_stylesheet_utf8(lh_ptr, CssTitle())
|
||||
vqt6.vqt6_qwidget_set_stylesheet_utf8(h2_ptr, CssTitle())
|
||||
vqt6.vqt6_qwidget_set_stylesheet_utf8(h2b_ptr, CssDim())
|
||||
vqt6.vqt6_qwidget_set_stylesheet_utf8(h3_ptr, CssTitle())
|
||||
vqt6.vqt6_qwidget_set_stylesheet_utf8(s3_ptr, CssDim())
|
||||
vqt6.vqt6_qwidget_set_stylesheet_utf8(h4_ptr, CssTitle())
|
||||
vqt6.vqt6_qwidget_set_stylesheet_utf8(eula_name_ptr, CssAccent())
|
||||
vqt6.vqt6_qwidget_set_stylesheet_utf8(summary_ptr, CssAccent())
|
||||
vqt6.vqt6_qwidget_set_stylesheet_utf8(disk_ptr, CssAccent())
|
||||
vqt6.vqt6_qwidget_set_stylesheet_utf8(ok_ptr, CssOk())
|
||||
vqt6.vqt6_qwidget_set_stylesheet_utf8(fsum_ptr, CssBody())
|
||||
vqt6.vqt6_qwidget_set_stylesheet_utf8(progress_status_ptr, CssDim())
|
||||
vqt6.vqt6_qwidget_set_stylesheet_utf8(path_label_ptr, CssPathBox())
|
||||
|
||||
|
||||
def ApplyTheme(theme: int):
|
||||
"""切换深/浅主题并重刷内联样式"""
|
||||
global cur_theme
|
||||
cur_theme = theme
|
||||
if theme == 1:
|
||||
vqt6.vqt6_qwidget_set_stylesheet_utf8(central_ptr, light_qss)
|
||||
else:
|
||||
vqt6.vqt6_qwidget_set_stylesheet_utf8(central_ptr, dark_qss)
|
||||
RestyleAll()
|
||||
GotoStep(cur_step)
|
||||
|
||||
|
||||
def SetTextPtrs(big: t.CPtr, sub: t.CPtr, desc: t.CPtr, lh: t.CPtr, h2: t.CPtr, h2b: t.CPtr, h3: t.CPtr, s3: t.CPtr, h4: t.CPtr, ok: t.CPtr, fsum: t.CPtr):
|
||||
"""记录各页文本标签指针(供主题切换重刷内联样式)"""
|
||||
global big_ptr, sub_ptr, desc_ptr, lh_ptr
|
||||
global h2_ptr, h2b_ptr, h3_ptr, s3_ptr, h4_ptr, ok_ptr, fsum_ptr
|
||||
big_ptr = big
|
||||
sub_ptr = sub
|
||||
desc_ptr = desc
|
||||
lh_ptr = lh
|
||||
h2_ptr = h2
|
||||
h2b_ptr = h2b
|
||||
h3_ptr = h3
|
||||
s3_ptr = s3
|
||||
h4_ptr = h4
|
||||
ok_ptr = ok
|
||||
fsum_ptr = fsum
|
||||
|
||||
|
||||
def OnThemeChanged(slot_id: int, data: t.CPtr):
|
||||
idx: int = vqt6.vqt6_qcombobox_current_index(theme_sel_ptr)
|
||||
ApplyTheme(idx)
|
||||
|
||||
|
||||
def main() -> int:
|
||||
global app_ptr, stack_ptr
|
||||
global nav0_ptr, nav1_ptr, nav2_ptr, nav3_ptr, nav4_ptr, nav5_ptr
|
||||
@@ -305,6 +463,7 @@ def main() -> int:
|
||||
global tree_ptr, license_box_ptr, eula_name_ptr
|
||||
global agree_cb_ptr, license_next_ptr, install_btn_ptr
|
||||
global channel_ptr, opt0_ptr, opt1_ptr, opt2_ptr
|
||||
global theme_sel_ptr, central_ptr
|
||||
|
||||
app = vqt6.QApplication(t.CPtr(0))
|
||||
app_ptr = t.CPtr(app._ptr)
|
||||
@@ -318,8 +477,31 @@ def main() -> int:
|
||||
central = vqt6.QWidget()
|
||||
central.setStyleSheet(dark_qss)
|
||||
win.setCentralWidget(central._ptr)
|
||||
central_ptr = t.CPtr(central._ptr)
|
||||
|
||||
root = vqt6.QHBoxLayout(central)
|
||||
vroot = vqt6.QVBoxLayout(central)
|
||||
vroot.setContentsMargins(0, 0, 0, 0)
|
||||
vroot.setSpacing(0)
|
||||
|
||||
# ===== 右上角:主题切换 =====
|
||||
topbar = vqt6.QHBoxLayout()
|
||||
topbar.setContentsMargins(0, 6, 14, 2)
|
||||
topbar.setSpacing(8)
|
||||
vroot.addLayout(topbar._ptr)
|
||||
topbar.addStretch(1)
|
||||
theme_lb = vqt6.QLabel("主题:")
|
||||
topbar.addWidget(theme_lb._ptr)
|
||||
theme_sel = vqt6.QComboBox()
|
||||
theme_sel.addItem("深色")
|
||||
theme_sel.addItem("浅色")
|
||||
theme_sel.setCurrentIndex(0)
|
||||
topbar.addWidget(theme_sel._ptr)
|
||||
theme_sel_ptr = t.CPtr(theme_sel._ptr)
|
||||
theme_sel.currentIndexChanged(OnThemeChanged, 0)
|
||||
|
||||
root = vqt6.QHBoxLayout()
|
||||
root.setContentsMargins(0, 0, 0, 0)
|
||||
vroot.addLayout(root._ptr)
|
||||
|
||||
# ===== 左导航面板(宽度固定,高度随窗口拉伸) =====
|
||||
nav_panel = vqt6.QWidget()
|
||||
@@ -652,6 +834,7 @@ def main() -> int:
|
||||
timer_ptr = t.CPtr(timer._ptr)
|
||||
|
||||
# 初始化组件统计
|
||||
SetTextPtrs(big._ptr, sub._ptr, desc._ptr, lh._ptr, h2._ptr, h2b._ptr, h3._ptr, s3._ptr, h4._ptr, ok._ptr, fsum._ptr)
|
||||
UpdateCompInfo()
|
||||
|
||||
GotoStep(0)
|
||||
|
||||
Reference in new issue
Block a user