多窗口模态问题
- 模态,将用户焦点强制聚焦到当前对话框,使用户无法切换当前Qt应用,保证用户按照设计的逻辑进行操作
Qt.NonModal # 非模态:正常模式
Qt.WindowModal # 半模态:窗口级模态对话框,阻塞父窗口、父窗口的父窗口及兄弟窗口
Qt.ApplicationModal # 模态:应用程序级模态对话框,阻塞整个应用程序的所有窗口
实列
NonModal
qtwin01.py
import sys
from PyQt5.QtWidgets import QMainWindow, QVBoxLayout, QPushButton, QApplication, QWidget, QLineEdit
from PyQt5.QtCore import Qt
from dialog01 import Dialog
class Wind(QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.resize(400, 500)
layout = QVBoxLayout()
self.button1 = QPushButton('button1')
self.button1.clicked.connect(self.show_dialog)
self.edit = QLineEdit()
widget = QWidget()
layout.addWidget(self.button1)
layout.addWidget(self.edit)
widget.setLayout(layout)
self.setCentralWidget(widget)
def show_dialog(self):
print('show_dialog')
dialog = Dialog(self)
dialog.setWindowModality(Qt.NonModal)
dialog.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
win = Wind()
win.show()
sys.exit(app.exec_())
- dialog01.py
from PyQt5.QtWidgets import QDialog, QVBoxLayout, QLabel, QLineEdit, QApplication
import sys
class Dialog(QDialog):
def __init__(self, parent=None):
super().__init__(parent)
layout = QVBoxLayout()
label = QLabel('name')
layout.addWidget(label)
line_edit = QLineEdit()
line_edit.setPlaceholderText('input name')
layout.addWidget(line_edit)
self.setLayout(layout)
效果
- 可以切换焦点
WindowModal
dialog.setWindowModality(Qt.WindowModal)
效果
- 无法切换焦点到主窗口
ApplicationModal
dialog.setWindowModality(Qt.ApplicationModal)
效果
- 本案例同上
方式2
- 修改 show_dialog,使用如下方式,也可实现焦点无法切换
def show_dialog(self):
print('show_dialog')
dialog = Dialog()
dialog.exec_() # 将qt的线程循环在dialog界面上,导致无法切换焦点
print('end')
#####效果