main_qml.py 2.38 KB
"""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()