You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyQt5如何禁用整个窗口/QWidget的焦点与用户交互

禁用QWidget焦点并阻止程序其余交互的正确方式

你用self.setFocusPolicy(QtCore.Qt.NoFocus)没效果很正常——这个方法只是控制当前部件是否接收焦点,根本管不了用户和程序里其他部件的交互。要实现显示加载窗口时锁定整个程序,有两种实用方案:

方案一:禁用主窗口/父部件的交互能力

直接把需要锁定的主窗口或者父级部件设为不可用,加载完成后再恢复:

# 显示加载窗口前,禁用主窗口
self.main_window.setEnabled(False)
# 弹出加载窗口
self.loading_window.show()
# 加载完成后,恢复主窗口的交互
self.main_window.setEnabled(True)

方案二:把加载窗口设为模态窗口

如果你的加载窗口是QDialog子类,直接设置为模态,它显示时会自动阻断用户操作其他窗口:

# 初始化加载窗口时开启模态
self.loading_window = QDialog(self)
self.loading_window.setModal(True)
# 用exec_()显示会阻塞直到窗口关闭,适合加载逻辑在窗口内处理的场景
self.loading_window.exec_()

要是加载窗口是普通QWidget,也可以通过windowModality属性实现全局模态:

self.loading_window.setWindowModality(QtCore.Qt.ApplicationModal)
self.loading_window.show()

注意:用show()显示模态窗口不会阻塞代码执行,需要自己处理加载完成后的窗口关闭和交互恢复;exec_()会阻塞到窗口关闭,逻辑更简单。

内容的提问来源于stack exchange,提问作者mountaincabb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 00:03:19