main_qml.py
2.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
"""QML PoC 入口 — 验证 QtQuick + Apple 风格自定义视觉。
只做 UI 演示:
- 登录页 (LoginScreen.qml)
- 主窗口 (MainWindow.qml) 含 3 tab + 任务队列 sidebar
- 图片生成 tab 的核心 UI 元素
不接业务后端(不真的生成图片 / 调 db),让用户先看视觉。
跑:.venv/Scripts/pythonw.exe qml_poc/main_qml.py
"""
import sys
from pathlib import Path
from PySide6.QtCore import QObject, QUrl, Property, Signal, Slot
from PySide6.QtGui import QGuiApplication
from PySide6.QtQml import QQmlApplicationEngine
from PySide6.QtQuickControls2 import QQuickStyle
class AppState(QObject):
"""暴露给 QML 的全局状态。最小骨架,业务后续再接。"""
loggedInChanged = Signal()
currentTabChanged = Signal()
def __init__(self):
super().__init__()
# PoC 调试:QML_AUTO_LOGIN=1 时直接登录态,免每次重启进程都发回车登录
import os
self._logged_in = os.environ.get("QML_AUTO_LOGIN", "") == "1"
self._current_tab = 0
@Property(bool, notify=loggedInChanged)
def loggedIn(self):
return self._logged_in
@Property(int, notify=currentTabChanged)
def currentTab(self):
return self._current_tab
@Slot(str, str, result=bool)
def login(self, username: str, password: str) -> bool:
# PoC:随便接受,业务不接
if not username or not password:
return False
self._logged_in = True
self.loggedInChanged.emit()
return True
@Slot()
def logout(self):
self._logged_in = False
self.loggedInChanged.emit()
@Slot(int)
def setTab(self, idx: int):
self._current_tab = idx
self.currentTabChanged.emit()
def main():
QQuickStyle.setStyle("Basic") # 纯净底,不引入 Material/Win11 的视觉污染
app = QGuiApplication(sys.argv)
app.setApplicationName("珠宝壹佰图像生成器")
app.setOrganizationName("ZB100")
state = AppState()
engine = QQmlApplicationEngine()
engine.rootContext().setContextProperty("appState", state)
qml_dir = Path(__file__).parent / "qml"
engine.addImportPath(str(qml_dir))
engine.load(QUrl.fromLocalFile(str(qml_dir / "Main.qml")))
if not engine.rootObjects():
print("QML load failed", file=sys.stderr)
sys.exit(1)
sys.exit(app.exec())
if __name__ == "__main__":
main()