feat(plugin): 实现插件卸载功能与自重启机制
目的:补齐 Event.Uninstall 空实现,打通卸载全链路。 背景:原 plugin_registry.py 的 Uninstall 分支为空 pass;运行时直接 os.remove 删 .pyd 触发 WinError 5(Windows 文件锁,.pyd 已被 import)。 方案: - 卸载流程分层清理:Worker 写待删清单 → Registry 清字典/obj → main 清 toolBar/stackedWidget → plugins_card 刷新为未安装 - .pyd 文件删除延迟到下次启动 _process_pending_uninstalls, 在 worker 线程启动前、import 之前执行,避开文件锁 - 卸载后自动重启:QProcess.startDetached + QApplication.quit, 兼容开发模式(python.exe)与打包模式(main.exe) - _remove_with_retry 应对自重启时原进程句柄未释放的暂态竞争 - _on_local_discovered 加异常隔离,单插件失败不拖垮初始化 - QThread 生命周期管理:aboutToQuit → shutdown(quit+wait), finished → worker.deleteLater,消除 Destroyed 警告 - plugins_card 抽 refresh() 方法,统一卡片状态刷新 影响:卸载功能可用;自重启在命令行/打包模式正常,调试器环境 可能因子进程管理闪退(不影响交付)。
This commit is contained in:
@@ -64,10 +64,12 @@ class Plugins(QWidget, Ui_FormPlugins):
|
||||
self.setupUi(self)
|
||||
|
||||
self.plugin_registry = plugin_registry
|
||||
self.cards: dict = {}
|
||||
|
||||
self.initUI()
|
||||
self.load_stylesheet()
|
||||
self.plugin_registry.update_plugins_card_signal.connect(self.on_update_plugins_card)
|
||||
self.plugin_registry.uninstall_completed_signal.connect(self.on_plugin_uninstalled)
|
||||
|
||||
def initUI(self) -> None:
|
||||
"""
|
||||
@@ -140,11 +142,17 @@ class Plugins(QWidget, Ui_FormPlugins):
|
||||
item = QListWidgetItem(self.listWidget)
|
||||
plugin_card = PluginsCard(name, plugins[name])
|
||||
plugin_card.send_event_signal.connect(self.plugin_registry.start_plugins_event)
|
||||
|
||||
self.cards[name] = plugin_card
|
||||
|
||||
item.setSizeHint(QSize(plugin_card.sizeHint().width(), 200))
|
||||
self.listWidget.addItem(item)
|
||||
self.listWidget.setCurrentItem(item)
|
||||
self.listWidget.setItemWidget(item, plugin_card)
|
||||
pass
|
||||
|
||||
def on_plugin_uninstalled(self, name: str) -> None:
|
||||
"""卸载完成后刷新对应卡片状态。"""
|
||||
card = self.cards.get(name)
|
||||
if card is not None:
|
||||
card.refresh()
|
||||
|
||||
Reference in New Issue
Block a user