-
-
Notifications
You must be signed in to change notification settings - Fork 0
README
Zuko edited this page Jan 26, 2026
·
2 revisions
Comprehensive reference for the
corenamespace
Last updated: 2026-01-21
core namespace là nền tảng của framework, cung cấp các building blocks cơ bản cho ứng dụng PySide6:
- Application Lifecycle: QtAppContext quản lý khởi động, feature flags, và shutdown
- Dependency Injection: ServiceLocator với global và scoped services
- Event System: Observer pattern (Publisher/Subscriber) cho decoupled communication
- UI Architecture: BaseController + WidgetManager + Handler pattern
- Task System: Background task execution với scheduling, chaining, persistence
- Utilities: Logging, Config, Exception handling, Path management
from core import QtAppContext
# 1. Get global instance
ctx = QtAppContext.globalInstance()
# 2. Bootstrap application
ctx.bootstrap()
# 3. Access core services
config = ctx.config
publisher = ctx.publisher
logger = ctx.logger
# 4. Run Qt event loop
ctx.run()from core import BaseController, BaseCtlHandler
from PySide6.QtWidgets import QWidget
class MyController(BaseController, QWidget):
slot_map = {
'buttonClicked': ['myButton', 'clicked']
}
def setupUi(self, widget):
# UI setup here
pass
class MyControllerHandler(BaseCtlHandler):
def onButtonClicked(self):
self.widgetManager.get('myButton').setText('Clicked!')graph TB
App[Application] --> QtAppContext
QtAppContext --> ServiceLocator
QtAppContext --> Config
QtAppContext --> Publisher
QtAppContext --> NetworkManager
QtAppContext --> TaskManager
BaseController --> WidgetManager
BaseController --> Handler[BaseCtlHandler]
Handler --> Publisher
TaskManager --> TaskQueue
TaskManager --> TaskTracker
TaskManager --> TaskScheduler
ServiceLocator --> GlobalServices[Global Services]
ServiceLocator --> ScopedServices[Scoped Services]
style QtAppContext fill:#e1f5ff
style ServiceLocator fill:#fff4e1
style Publisher fill:#e8f5e9
style TaskManager fill:#f3e5f5
- Application Context - QtAppContext lifecycle management
- Dependency Injection - ServiceLocator patterns
- Observer Pattern - Publisher/Subscriber event system
- Controller Architecture - BaseController và slot_map
- Widget Management - WidgetManager utilities
- Configuration - Config singleton
- Logging - Loguru-based logging
- Network Manager - Qt network integration
- Exceptions - Exception handling
- Utilities - PathHelper, OsHelper, PythonHelper, WidgetUtils
- Decorators - @singleton, @catchExceptInMsgBox, etc.
- Task System Overview - Architecture và components
- AbstractTask - Base task class
- Task Chain - Sequential task execution
- Task Manager - TaskManagerService API
- Acknowledgment System - ACK/NACK protocol
- Contracts - Interfaces
- Extends - Extensions
- Model - Data models
- Common Use Cases - Recipes và examples
- Improvement Suggestions - Đề xuất cải tiến
- Pixi Guide - Hướng dẫn sử dụng Pixi vs Pip
- CLI Scripts - Hướng dẫn sử dụng scripts tiện ích
- Testing - Hướng dẫn chạy test và viết test
Core sử dụng environment variables để enable/disable features:
# .env file
PSA_ENABLE_NETWORK=true # Enable NetworkManager
PSA_ENABLE_TASKS=true # Enable TaskSystemGlobal Services (Singletons):
- Config, Publisher, NetworkManager, TaskManager
- Tồn tại suốt application lifetime
Scoped Services (Task-specific):
- Browser instances, temporary resources
- Tự động cleanup khi task hoàn thành
ctx = QtAppContext.globalInstance()
# Global service
config = ctx.config
# Scoped service
taskId = self.uuid
browser = ChromeBrowserService()
ctx.registerScopedService(taskId, browser)
try:
# Use browser
pass
finally:
ctx.releaseScope(taskId) # Auto cleanup# Publisher
publisher = ctx.publisher
publisher.notify('user.login', userId=123)
# Subscriber
class MyHandler(Subscriber):
def __init__(self):
super().__init__(events=['user.login'])
def onUserLogin(self, userId: int):
print(f'User {userId} logged in')- Separation of Concerns: Controller chỉ wire UI, Handler xử lý logic
- Dependency Injection: Sử dụng ServiceLocator thay vì direct instantiation
- Event-Driven: Components communicate qua Publisher, không direct coupling
- Thread-Safe: QMutex cho critical sections
- Resource Management: Scoped services với auto cleanup
# Controller: UI wiring only
class MyController(BaseController, QWidget):
slot_map = {
'saveClicked': ['saveButton', 'clicked']
}
# Handler: Business logic
class MyControllerHandler(BaseCtlHandler):
def onSaveClicked(self):
data = self.widgetManager.get('dataInput').text()
# Process data...from core.taskSystem import AbstractTask
class MyTask(AbstractTask):
def handle(self):
for i in range(100):
if self.isStopped():
return
# Do work...
self.setProgress(i)
# Add to queue
ctx.taskManager.addTask(MyTask(name='My Task'))def executeTask(self):
ctx = QtAppContext.globalInstance()
taskId = self.uuid
# Register scoped resources
browser = ChromeBrowserService()
ctx.registerScopedService(taskId, browser)
try:
# Use resources
browser.navigate('https://example.com')
finally:
# Auto cleanup all scoped services
ctx.releaseScope(taskId)Nếu bạn đang sử dụng docs cũ (docs/provided-by-base/), lưu ý:
- ✅ Architecture mindset vẫn đúng: Separation of concerns, Observer pattern
⚠️ API details đã thay đổi: Tham khảo docs mới cho chính xác⚠️ Feature flags mới: PSA_ENABLE_* environment variables⚠️ ServiceLocator API:registerScopedServicethay vì cách cũ
- API Reference: Xem các file documentation cụ thể
-
Examples: Tham khảo
20-common-use-cases.md -
Source Code:
core/directory với docstrings chi tiết - Issues: Báo cáo qua improvement suggestions
- Đọc Application Context để hiểu bootstrap process
- Đọc Controller Architecture để tạo UI components
- Đọc Task System Overview để làm background tasks
- Đọc Common Use Cases cho practical examples