PySide6 Code Reviewer
PySide6代码审查专家
Expert code review for modern PySide6/Qt 6.8+ applications.
针对现代PySide6/Qt 6.8+应用的专业代码审查服务。
- Identify Qt version assumptions — Verify code targets Qt 6.8+ (no Qt5 compat)
- Check thread safety — All GUI operations on main thread, proper worker patterns
- Validate signal/slot usage — Modern connection syntax, proper signatures
- Assess Model/View implementation — Role usage, data method patterns, index validity
- Review resource management — Parent-child ownership, prevent leaks
- Evaluate async patterns — QThread, QtConcurrent, asyncio integration
- Check QML integration — Property bindings, type registration, context exposure
- 确认Qt版本适配 — 验证代码目标为Qt 6.8+(无Qt5兼容代码)
- 检查线程安全 — 所有GUI操作在主线程执行,采用正确的工作线程模式
- 验证信号/槽使用 — 现代连接语法,正确的签名匹配
- 评估Model/View实现 — 角色使用、数据方法模式、索引有效性
- 审查资源管理 — 父子对象所有权,防止内存泄漏
- 评估异步模式 — QThread、QtConcurrent、asyncio集成
- 检查QML集成 — 属性绑定、类型注册、上下文暴露
Critical Anti-Patterns (Always Flag)
严重反模式(必须标记)
WRONG: GUI operation from worker thread
WRONG: GUI operation from worker thread
class Worker(QThread):
def run(self):
self.label.setText("Done") # CRASH: Cross-thread GUI access
class Worker(QThread):
def run(self):
self.label.setText("Done") # CRASH: Cross-thread GUI access
WRONG: Blocking the event loop
WRONG: Blocking the event loop
def on_button_click(self):
time.sleep(5) # FREEZES UI
requests.get(url) # FREEZES UI
def on_button_click(self):
time.sleep(5) # FREEZES UI
requests.get(url) # FREEZES UI
WRONG: Old-style signal connection (Qt4/5 legacy)
WRONG: Old-style signal connection (Qt4/5 legacy)
self.connect(button, SIGNAL("clicked()"), self.handler)
self.connect(button, SIGNAL("clicked()"), self.handler)
WRONG: String-based slot connection
WRONG: String-based slot connection
button.clicked.connect("self.handler") # Should be callable
button.clicked.connect("self.handler") # Should be callable
WRONG: No parent = memory leak risk
WRONG: No parent = memory leak risk
label = QLabel("text") # Should have parent or be assigned to layout
label = QLabel("text") # Should have parent or be assigned to layout
WRONG: Deleting QObject while signals pending
WRONG: Deleting QObject while signals pending
obj.deleteLater() # OK
del obj # WRONG if signals/slots active
obj.deleteLater() # OK
del obj # WRONG if signals/slots active
WRONG: Direct widget manipulation in QThread.run()
WRONG: Direct widget manipulation in QThread.run()
class BadWorker(QThread):
def run(self):
self.progress_bar.setValue(50) # Thread violation!
class BadWorker(QThread):
def run(self):
self.progress_bar.setValue(50) # Thread violation!
Modern Patterns (Require These)
现代编程模式(推荐使用)
Signal/Slot Connections
信号/槽连接
Qt 6 style - always use this
Qt 6 style - always use this
button.clicked.connect(self.on_click)
button.clicked.connect(lambda: self.handler(arg))
button.clicked.connect(self.on_click)
button.clicked.connect(lambda: self.handler(arg))
Typed signals with modern syntax
Typed signals with modern syntax
class Worker(QObject):
progress = Signal(int) # Single type
result = Signal(str, list) # Multiple types
error = Signal(Exception) # Exception passing
finished = Signal() # No arguments
class Worker(QObject):
progress = Signal(int) # Single type
result = Signal(str, list) # Multiple types
error = Signal(Exception) # Exception passing
finished = Signal() # No arguments
Thread-Safe Worker Pattern
线程安全的工作线程模式
python
class Worker(QObject):
finished = Signal()
progress = Signal(int)
result = Signal(object)
error = Signal(str)
@Slot()
def run(self):
try:
for i in range(100):
# Do work
self.progress.emit(i)
self.result.emit(data)
except Exception as e:
self.error.emit(str(e))
finally:
self.finished.emit()
python
class Worker(QObject):
finished = Signal()
progress = Signal(int)
result = Signal(object)
error = Signal(str)
@Slot()
def run(self):
try:
for i in range(100):
# Do work
self.progress.emit(i)
self.result.emit(data)
except Exception as e:
self.error.emit(str(e))
finally:
self.finished.emit()
thread = QThread()
worker = Worker()
worker.moveToThread(thread)
thread.started.connect(worker.run)
worker.finished.connect(thread.quit)
worker.finished.connect(worker.deleteLater)
thread.finished.connect(thread.deleteLater)
thread.start()
thread = QThread()
worker = Worker()
worker.moveToThread(thread)
thread.started.connect(worker.run)
worker.finished.connect(thread.quit)
worker.finished.connect(worker.deleteLater)
thread.finished.connect(thread.deleteLater)
thread.start()
Async Integration (Qt 6.8+)
异步集成(Qt 6.8+)
python
import asyncio
from PySide6.QtAsyncio import QAsyncioEventLoopPolicy
python
import asyncio
from PySide6.QtAsyncio import QAsyncioEventLoopPolicy
Set up asyncio with Qt event loop
Set up asyncio with Qt event loop
asyncio.set_event_loop_policy(QAsyncioEventLoopPolicy())
class AsyncWidget(QWidget):
async def fetch_data(self):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
return await response.json()
def start_fetch(self):
asyncio.ensure_future(self.fetch_data())
asyncio.set_event_loop_policy(QAsyncioEventLoopPolicy())
class AsyncWidget(QWidget):
async def fetch_data(self):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
return await response.json()
def start_fetch(self):
asyncio.ensure_future(self.fetch_data())
Detailed Reference Files
详细参考文档
- references/signals-slots.md — Signal/slot patterns, connection types, thread-safe emission
- references/model-view.md — QAbstractItemModel, roles, proxies, delegates
- references/threading.md — QThread, QtConcurrent, async patterns, thread pools
- references/widgets.md — Widget lifecycle, layouts, styling, high-DPI
- references/qml-integration.md — QML/Python bridge, properties, type registration
- references/performance.md — Paint optimization, model efficiency, lazy loading
- references/anti-patterns.md — Comprehensive anti-pattern catalog with fixes
- references/signals-slots.md — 信号/槽模式、连接类型、线程安全发射
- references/model-view.md — QAbstractItemModel、角色、代理、委托
- references/threading.md — QThread、QtConcurrent、异步模式、线程池
- references/widgets.md — 组件生命周期、布局、样式、高DPI适配
- references/qml-integration.md — QML/Python桥接、属性、类型注册
- references/performance.md — 绘制优化、模型效率、懒加载
- references/anti-patterns.md — 完整的反模式目录及修复方案
Review Checklist (Use for PRs)
PR审查检查清单(用于PR审查)
Signal/Slot Correctness
信号/槽正确性
Qt 6.8+ Specifics
Qt 6.8+特性适配