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
相关产品推荐
相关产品推荐

